qt調用quit()后未結束線程解決方案


正常操作

正常寫Qt的多線程,需要繼承QThread,然后重寫run函數,調用start后,在run函數中實現子線程的運行,這個時候會開啟事件循環,可以調用quit()函數來結束當前的線程。

其他操作

根據qt的官方文檔,可以通過連接槽的方式,然后利用Qt::DiretionConnection來實現多線程。大概如下所示:

QThread proxyThread = new QThread();
connect(proxyThread, &QThread::started, this, &TestThread::runEx, Qt::DirectConnection);
connect(this, &TestThread::finished, proxyThread, &QThread::quit);

在RunEx函數末,emit finished()信號,即可調用quit來“嘗試”結束proxyThread線程。

但是如果在主線程中調用proxyThread->isRunning()的死循環來判斷當前線程是否結束,得到的結果始終都是true。

如果貿然的使用delete來釋放線程,會讓程序崩潰。

看到網上有很多說法,比如說調用isFinished來判斷,但是isFinished一直都是false。

換句話說,quit()根本就沒有讓proxyThread結束掉。

在查閱各種資料后,發現在“主線程”調用terminate()可以主動的結束子線程。

也就是

emit finished();
proxyThread->terminate();

即可正確結束線程,調用delete也不會讓程序崩潰了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM