1. 程式人生 > 實用技巧 >QT自由執行緒的終止

QT自由執行緒的終止

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