Qt中執行後台執行緒不阻塞UI執行緒的方案

2021-09-08 13:29:35 字數 721 閱讀 9408

有乙個想法,乙個客戶端,有gui介面的同時也要向網路伺服器傳送本地採集的資料,通過網路傳送資料的介面是同步阻塞的,需要等待伺服器響應資料。

如果不採用後台執行緒的方案,用主ui執行緒關聯乙個定時器qtimer來做定時任務傳送,那麼gui介面會由於定時器事件響應的槽函式的阻塞,導致整個gui的按鈕事件在某些時刻無法及時響應,會有卡頓的情況。

所以,後台需要執行乙個後台執行緒,與主線程分離,並且該後台執行緒需要關聯乙個自己的qtimer,來做定時任務資料採集。

方案其實可以用qthread來做,首先,做乙個task class:

1 #include 2 #include 3

4class mytaskclass : public

qobject516

public

slots:

17void

datacollectionsendtask()

1821

private:22

qtimer m_task_timer;

2324

25 };

然後建立乙個qthread執行緒,把整個mytaskclass類的例項move到執行緒中就可以了:

mytaskclass.hpp"4

5int main(int argc, char *ar**)6

以上**就不會阻塞gui執行緒了。乙個後台執行緒有乙個自己的定時器。

references:

Qt中UI執行緒與子執行緒的互動

gui框架一般只允許ui執行緒操作介面元件,qt也是如此。但我們的應用程式一般是多執行緒的,勢必就涉及到ui執行緒與子執行緒的互動。下面介紹常用的ui執行緒與子執行緒互動方式,並附上自己的demo。qt中提供了一些執行緒安全的方法來讓我們使用 a.使用訊號槽 qt的訊號槽是執行緒安全的。connec...

Qt多執行緒程式設計中的物件執行緒與函式執行執行緒

為了更清楚的理解這些問題,在此特編了個小例子說明一下。首先定義乙個從qobject繼承的類someobject,包含乙個訊號somesignal和乙個成員函式callemitsignal,此函式用於傳送前面的somesignal訊號。定義如下 define object class class so...

Qt多執行緒程式設計中的物件執行緒與函式執行執行緒

2017 05 10 16 40 25人閱讀收藏 編輯刪除 qt 24 作者同類文章x 而對於伺服器來說,多執行緒的這個特性太有用了,因為多執行緒使得伺服器可能同時響應多個客戶端的請求,所以現在伺服器大多採用多執行緒,所以才會造成我開始的誤解。不管是多執行緒,還是伺服器,qt中已經封裝好了特定的類,...