Qt多執行緒開發 QThread

2021-10-10 11:18:40 字數 2323 閱讀 5855

//.**件

class

mythread

:public qthread

~mythread()

virtual

void

run();

/*******************/};

/****************************/

//.cpp檔案

void mythread::

run(

)}

//.**件

class

mythread

:public qthread

~mythread()

virtual

void

run();

/*******************/};

class

movethread

:public qobject

~movethread()

};class

mainwindow

:public qmainwindow

;

//.cpp檔案

mainwindow::

mainwindow

(qwidget *parent)

:qmainwindow

(parent),ui

(new ui::mainwindow)

二者建立執行緒的優缺點和差異在以後文章中會單獨列出(關於qt多執行緒下訊號槽的呼叫機制及事件迴圈機制的介紹)

不應該直接呼叫run函式,而應該使用**start()**函式

執行緒退出函式:quit()、exit()、terminate()用於執行緒終結退出

1.quit()函式告訴執行緒退出事件迴圈,讓exec()返回0(成功)。等同於呼叫qthread::exit(0)。如果執行緒沒有事件迴圈,這個函式什麼事也不做。

2.exit()函式通知執行緒退出事件迴圈,並且傳入乙個code值。

呼叫該函式後,執行緒退出事件迴圈,並從qeventloop::exec()呼叫中返回。qeventloop::exec()返回乙個returncode碼。一般情況,返回碼為0意味著呼叫成功,非0值代表失敗。

注意:和c庫同名的函式不一樣,呼叫該函式不返回乙個值,它僅僅產生乙個停止事件。

3.terminate()函式立即終止乙個執行緒可以使用,但這個函式存在非常不安定因素,不推薦使用

4.執行緒呼叫wait()函式可以阻斷本身的執行,直到其他的執行緒完成執行(或者乙個指定的時間間隔後)。

方法是新增乙個bool變數,通過主線程修改這個bool變數來進行終止,但這樣有可能引起訪問衝突,所以需要加鎖聯合使用。具體操作如下:

//.**件

class

mythread

:public qthread

void

runstop()

bool

getcurrentstate()

/**********變數區**********/

protected

:volatile

bool iscanrun =

false

;public slots:

void

stopimmediatelys1()

;private

:static qmutex m_lock;

//原子操作鎖

/*******************/

};

//.cpp檔案

mythread::

mythread()

qmutex mythread::m_lock;

//初始化靜態鎖

mythread::

~mythread()

void mythread::

stopimmediatelys1()

void mythread::

run()}

exec()

;//開啟事件迴圈

}}

QT多執行緒(QThread)小結

qthread只有run函式是在新執行緒裡的,其他所有函式都在qthread生成的執行緒裡 如果qthread是在ui所在的執行緒裡生成,那麼qthread的其他非run函式都是和ui執行緒一樣的,所以,qthread的繼承類的其他函式盡量別要有太耗時的操作,要確保所有耗時的操作都在run函式裡。在...

QT中的執行緒QThread

譯文如下 class worker public qobject signals void resultready const qstring result class controller public qobject controller public slots void handleresu...

QThread多執行緒程式設計分析

傳統圖形介面應用程式都只有乙個執行緒執行,並且一次執行乙個操作。如果使用者呼叫乙個比較耗時的操作,就會凍結介面響應。乙個解決方法是按照事件處理的思路 呼叫 或來強迫事件迴圈進行,但是這種做法是有潛在風險的。按照 可能會引起遞迴,導致棧溢位崩潰的說法,當主線程在某個槽函式裡正在執行 processev...