QT學習記錄(二)在QT中加入多執行緒的方式

2021-10-09 02:14:56 字數 3615 閱讀 9822

近期在解析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學習(二) 多執行緒控制

執行緒之間存在著相互制約的關係,具體可分為互斥和同步這兩種關係。在程式中,通常都會用到叫做 臨界資源 的東西,可能是一塊記憶體,乙個資料結構,乙個檔案等具有排他性使用的東西。這些東西,在多執行緒環境下,必須進行互斥處理,才能安全地使用臨界資源。所以,對臨界資源執行互斥操作的 片段,叫做臨界區。互斥量...