看了不少qt執行緒的東西,下面總結一下qt新建乙個執行緒的方法。
繼承qthread,這應該是最常用的方法了。我們可以通過重寫虛函式void qthread::run ()實現我們自己想做的操作,實現新建執行緒的目的。前面已經介紹了qthread,這裡就不重複了。
這種方法,我們每一次要新建乙個執行緒都需要繼承qthread,實現乙個新的類,有點不太方便。但是相對於qrunnable,這種方法的好處就是我們可以直接呼叫物件的start()函式啟動執行緒,而qrunnable必須借助qthreadpool。
qrunnable是所有可執行物件的基類。我們可以繼承
qrunnable,並重寫虛函式void qrunnable::run () 。我們可以用
qthreadpool
讓我們的乙個
qrunnable物件在另外的執行緒中執行,如果autodelete
()返回true(預設),那麼qthreadpool
將會在run()執行結束後自動刪除qrunnable物件。可以呼叫void qrunnable::setautodelete ( bool autodelete )更改auto-deletion標記。需要注意的是,必須在呼叫qthreadpool::start
()之前設定,在呼叫qthreadpool::start
()之後設定的結果是未定義的。
下面是我寫的簡單的例子:
由結果可看出,run()確實是在不同於主線程的另外執行緒中執行的,而且在執行結束後就呼叫了析構函式,因為預設是可以自動被銷毀的。
我們可以對同乙個物件多次呼叫qthreadpool::start
(),如果是可以自動被銷毀的,qrunnable物件會在最後乙個執行緒離開了run函式之後才被銷毀的。
int main(int argc, char *argv)
我三次呼叫qthreadpool::globalinstance()->start(&runobj);,但是在三次都執行完之後才執行析構函式。
這種新建執行緒的方法的最大的缺點就是:不能使用qt的訊號—槽機制,因為
qrunnable不是繼承自qobject。所以我們要想知道執行緒是否執行結束或獲取執行結果可能會比較麻煩。還有就是我們不能直接呼叫run()啟動執行緒,必須借助於qthreadpool。
但是這種方法的好處就是,可以讓qthreadpool
來管理執行緒,qthreadpool
會自動的清理我們新建的qrunnable物件。
首先我們必須實現繼承qobject的乙個類,實現我們想要的功能。
class worker:publicqobject
;worker::worker():qobject()
worker::~worker()
void worker::fun1()
接著建立乙個物件,並呼叫:movetothread ( qthread
* targetthread ),讓物件在新的執行緒中執行。
int main(int argc, char *argv)
這樣就能讓fun1()和fun2()都執行在thread執行緒中了。
需要注意的是:在work 的函式結束執行前,thread不能被析構。thread的生命期不能小於work。否則的話程式就好崩掉了。
像下面的**肯定是不行的。
void dialog::startwork()
所以thread 必須是new出來的。但是這樣的話,就感覺有點麻煩,我們要同時管理thread和work,因為都是new 出來,我們需要負責清理。為了避免這樣的麻煩,我想到的方法是,在work類中新增乙個qthread成員。
class worker:publicqobject
;worker::worker():qobject()
這樣我們在用的時候只需要newwork就行了。
其實前面也有用到qtconcurrent::run啟動新執行緒了。qtconcurrent命名空間提供了很多方法可以實現併發程式設計,這個以後再深入**了,這裡只是大概講一下啟動執行緒。還是用上面的worker**作為例子:
qtconcurrent::run是個模板函式,有很多種形式,我們也可以讓全域性的函式允許在另外的執行緒中。
目前所知的新建執行緒的方法就大概這些了,希望對大家有用,可能還要別的,以後再繼續學習了
Qt 新建執行緒的方法
感謝作者分享 看了不少qt執行緒的東西,下面總結一下qt新建乙個執行緒的方法。繼承qthread,這應該是最常用的方法了。我們可以通過重寫虛函式void qthread run 實現我們自己想做的操作,實現新建執行緒的目的。前面已經介紹了qthread,這裡就不重複了。這種方法,我們每一次要新建乙個...
QT中新建執行緒的幾種方法
qt新建執行緒的幾種方法 1.繼承qthread新建乙個類,重寫run方法,此方法除run之外,其他的都還是在主線程中執行 2.使用movetothread將新建執行緒轉移到繼承qobject的新類例項中 方法1 1.新建乙個類workthread,基類為qthread。2.重寫類workthrea...
Nuke中新建執行緒的方法
寫完後在menu.py中通過os.system path 方法即可開啟document。但問題出現了。這個說明文件用word開啟後會占用nuke主線程,導致nuke陷入假死狀態。只有關閉word才可以解除nuke假死。也就是說,實際上,word與nuke是共用同乙個執行緒,顯然這是不可接受的。於是寫...