//.**件
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...