2016-08-30 75 views
1

我有一個QThread聽服務器。我想立即暫停QThread的工作。根本沒有等待,但幾乎像是終止,它必須是立竿見影的。Qt,如何暫停QThread

+2

你能提供一些代碼嗎?現在還不清楚你的意思。如你所見,msleep方法立即暫停線程的工作。這是你想要的嗎? –

+1

_「它必須像刀一樣切割」_O_o –

+0

QThread的運行功能發出信號。我想終止由信號發出的東西alrealdy作品。 –

回答

11

在任何給定線程中運行的代碼不能在任何點停止,而不會破壞代碼和/或C/C++運行時或任何其他使用的庫中的共享數據結構的狀態。

該代碼只能停在明確定義的點上。

如果你的線程中運行一個事件循環(即通常,如果你不從QThread得到或沒有覆蓋其run),然後將QThread::quit()一旦控制權返回給事件循環,它是安全的停止線程這樣做。

如果你的線程運行重新實現有執行一個循環,它應該被要求中斷時返回:

void MyThread::run() { 
    while (! isInterruptionRequested()) { 
    ... 
    } 
} 

這樣的線程是QThread::requestInterruption()停止的。

僅供參考,這裏是有時迷茫的QThread各種方法:

  • wait()塊調用線程,直到被調用線程結束。當然,從線程本身調用它會立即造成死鎖:如果一個線程等待一些永遠不會發生的事情,線程就無法完成。

  • quit()儘早退出線程的事件循環,並導致返回QThread::run()。如果你重新實現了run()並且不旋轉事件循環,它什麼也不做。

  • requestTermination()設置一個標誌,表示YourThread::run()中的自定義循環可以通過isTerminationRequested()進行檢查。

  • terminate()停止線程現在。這通常會破壞您的應用程序的狀態,因此您必須很快或不久就要面臨後果。這種方法最好被遺忘。這實際上意味着「如果你有機會,很快就會崩潰這個過程並損壞一些磁盤數據」。