正常操作
正常寫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也不會讓程序崩潰了。
