背景:
把一個基於QObject的類的槽運行在另一個線程,我們可以用moveToThread的方法。
1 新建一個子線程類,編寫槽函數和信號,MyClass *m_MyClass=new MyClass(); 2 新建一個線程對象QThread *runThread=new QThread(); 3 使用connect連接當前類與子線程的信號槽,以便觸發線程及接收線程執行結果; 4 使用m_MyClass.moveToThread(runThread),將子線程類移到線程中執行; 5 runThread->start(),開啟線程。
以下子線程名稱統稱為B線程,主線程統稱為A線程;
B線程是在后台不斷的檢測PC連接的設備,當檢測到合適的設備連接成功后,A線程進行邏輯處理,此時B線程函數內部會直接return,等到A線程處理完連接設備的數據后,會再次新起一個B線程。(這里是因為A線程處理一次數據時間比較長,B線程沒必要一直運行。)
注: 此處之所以不用互斥量來加鎖,直接讓B線程阻塞是因為擔心死鎖,而且本身程序比較小,耗用內存和CPU什么的都非常小,重啟一個B線程也不會有影響。
問題:
但是B線程函數內部會直接return並不代表線程結束(歸根結底還是自己不了解如何調用),所以直接再次調用runThread.start()會報錯 QThread: Destroyed while thread is still running。
解決方法:
再次調用runThread.start()之前添加兩行:
1 runThread.quit() 2 runThread.wait()