QT自由執行緒的終止
阿新 • • 發佈:2020-12-06
1. QT執行緒(QThread的子類)的退出:
(1)使用terminate()函式無法退出;執行緒可能會立即被終止也可能不會,這取決於作業系統的排程策略,使用terminate()之後再使用QThread::wait()確保萬無一失。但我在程式中我發現使用VS2017編譯的程式無法使用terminate()。
(2)當刪除(delete)執行緒例項時,出現阻塞,程式無法進行。
解決方法:
(1)不再使用terminate退出,使用條件退出run函式
(2)在刪除執行緒例項時,可能需要判定它是否退出了run函式;最簡單的是使用wait(1000)這樣的函式等待其退出後再刪除。
2. QT執行緒中使用zmq時:
(1)可能會在zmq_recv函式阻塞時,無法退出執行緒
解決方法:
(1)採用定時的接收阻塞,保證有非阻塞狀態來檢查退出條件;
int recvTime = 1000; zmq_setsockopt(_socket, ZMQ_RCVTIMEO, &recvTime, sizeof(recvTime));
(2)在退出執行緒時最好將連線關閉。