感覺qt的線程有點坑,好吧,還是自己不太熟悉,今天抽空研究了一下,記錄下來。
我經常使用的是兩種線程:
1.繼承QThread, 重寫run()函數。
2.使用movethread()函數。
對於第一種,大家應該都比較熟悉,我的做法是在run函數中,通過設置bool值來控制線程的循環當run()函數退出的時候,會發出finished()信號,通過看qt文檔,建議是當信號發出的時候,連接到deleteLater()函數,connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater())),這樣就可以刪除線程了。
wait()函數相當於阻塞函數,目的是爲了防止主線程在次線程之前退出。
quit()函數,是槽函數。自己使用mvoetothread()函數的時候,使用到了它。當自己定義的類(比如worker)要退出的時候,發出信號,連接到線程thread的quit()槽函數。當發出信號的時候, 會調用quit()函數使線程退出。當線程退出後,會發生信號finished()。後面的步驟和上面的一樣了。
其實,使用倒是不難,關鍵如何正確的退出線程,這裏自己老是出錯。今天好好研究一下。對了,還有一點,就是用movetothread()函數的時候,連接對應的worker類的槽函數,確實是在次線程中,可是當自己連接worker類中的兩個槽函數時,我原以爲是在兩個不同的線程中,經過測試,其實是在同一個線程中,線程id是相同的。