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)在退出線程時最好將連接關閉。