近期在解析ts流檔案時發現資料量太大,如果在主線程處理會造成介面卡頓,所以需要在qt中加入多執行緒完成解析資料工作。
通常qt內加入多執行緒有三種比較方便的方式:
*****************************分割線------------------------------------
1.movetothread
新建乙個繼承qobject a,然後將耗時的工作函式
void dowork()
寫到這類裡面,在主線程new乙個qthread b,再利用
a-
>
movetothread
(b)
移動任務後再啟動執行緒b.start().
通過設定訊號與槽的關係觸發void dowork()
connect
(b,signal
(started()
), a,
slot
(dowork()
));connect
(b,signal
(finished()
), a,
slot
(deletelater()
));
完成觸發後需要保證安全退出,第二步已經在得到結束訊號後觸發析構
disconnect
(b,signal
(started()
), a,
slot
(dowork()
));//斷開訊號和槽函式聯絡
disconnect
(b,signal
(finished()
), a,
slot
(deletelater()
));if
(b)//退出執行緒釋放記憶體
delete b;
b =null;}
if(a)
//釋放記憶體
*****************************分割線------------------------------------
2.qthreadpool
利用qt自帶的執行緒池也很方便,我們需要自己定義乙個task類繼承qrunnable
標頭檔案
#ifndef task_h
#define task_h
#include
class
task
:public qrunnable
;#endif
// task_h
實現
#include
"task.h"
#include
#include
#include
#include
#include
#include
task::
task
(qstring filename)
:m_filename
(filename)
task::
~task()
void task::
run(
)
然後在主程式中通過以下開啟多執行緒
qthreadpool *q_pool =
newqthreadpool()
;q_pool-
>
setmaxthreadcount(1
);//設定最大執行緒數目
task *task =
newtask()
;//構造任務
q_pool-
>
globalinstance()
->
start
(task)
;//把任務加入到執行緒池
此處值得一提的是可以利用該函式和主函式通訊傳遞處理結果
qmetaobject::
invokemethod
(m_pobj,
"get_right_data"
,q_arg
(qstring,temp)
);
m_pobj:主線程物件
get_right_data:主線程接受結果的處理函式
q_arg(qstring,temp):傳遞的變數型別和變數名
需要在主線程中實現該函式
q_invokable void
get_right_data
(qstring msg)
;
*****************************分割線------------------------------------
3.qtconcurrent::run
最簡單的方式
首先在.pro檔案新增
qt +
= concurrent
然後新增好標頭檔案
以下是呼叫的幾種方式
mytest mc;
//qfuture後的<>內寫入函式返回的型別
//無引數返回,傳遞引數
qstring str =
"gg"
; qfuture<
void
> res = qtconcurrent::
run(
&mc,
&mytest::fun1,str)
;//有引數返回,無引數傳遞
qfuture<
bool
> res1 = qtconcurrent::
run(
&mc,
&mytest::fun2)
;for
(int i=
0;i<
10;i++
)//獲取執行緒中執行函式返回的結果
bool testres = res1.
result()
;qdebug()
<<
"res1:"
<< testres ;
//超過5個引數的呼叫
mydatainfo datainfo;
datainfo.a1 =1;
datainfo.a2 =2;
datainfo.a3 =3;
datainfo.a4 =4;
qfuture<
void
> res3 = qtconcurrent::
run(
&mc,
&mytest::fun3,str,datainfo);if
(!res.
isfinished()
)qdebug()
<<
"res:"
<< res.
isfinished()
;//true
QT多執行緒的學習
qt通過三種形式提供了對執行緒的支援。它們分別是,一 平台無關的執行緒類,二 執行緒安全的事件投遞,三 跨執行緒的訊號 槽連線。這使得開發輕巧的多執行緒qt程式更為容易,並能充分利用多處理器機器的優勢。多執行緒程式設計也是乙個有用的模式,它用於解決執行較長時間的操作而不至於使用者介面失去響應。在qt...
Qt多執行緒學習 二 使用QObject
總結參考鏈結 2018.1.26補充 在學習了繼承使用qobject來實現多執行緒之後,一直頻繁的使用,在這過程中,經常遇到這個問題 在主線程中建立多執行緒,然後主線程假死。qobject是qt框架的基本類,但凡涉及到訊號與槽有關的類都是繼承於qobject。qobject提供了qt關鍵技術訊號與槽...
Qt學習(二) 多執行緒控制
執行緒之間存在著相互制約的關係,具體可分為互斥和同步這兩種關係。在程式中,通常都會用到叫做 臨界資源 的東西,可能是一塊記憶體,乙個資料結構,乙個檔案等具有排他性使用的東西。這些東西,在多執行緒環境下,必須進行互斥處理,才能安全地使用臨界資源。所以,對臨界資源執行互斥操作的 片段,叫做臨界區。互斥量...