2016-06-13 87 views
0

我有同樣的情況是這樣的:stop thread started by qtconcurrent::runQtConcurrent ::運行如何停止後臺任務

我需要在封閉的closeEvent子線程(開始QtConcurrent ::運行)中的QMainWindow。 但我的孩子在使用線程函數的代碼從* .DLL:因爲所有我做的我不能老是用循環 - 被調用外部 DLL像

QFuture<void> = QtConcurrent::run(obj->useDllfunc_with_longTermJob()); 

當我關閉與x軸的應用按鈕我的GUI是關閉的,但第二個線程with_longTermJob()仍然工作,當完成時我有一個錯誤。 我知道有些決策是:

  1. 使用其他功能,如地圖()或別的東西與 QFuture.cancel /停止功能,而不是QtConcurrent :: run()的,但我只需要一個函數調用。 run()是我需要的。
  2. 或者使用QThread來代替Concurrent.But對我來說並不好。

什麼方法更簡單更好,我該如何實現呢?有沒有我不列出的方法? 您能否提供小代碼樣本以供決定。謝謝!

+0

http://stackoverflow.com/questions/32952474/non-blocking-worker-interrupt-file-copy?lq=1 – dtech

回答

1

QtConcurrent::run這裏不是問題。你必須有辦法停止dllFuncWithLongTermJob。如果你沒有這種手段,那麼你使用的API就會被破壞,而且你運氣不好。沒有什麼可以做到的,這通常是安全的。強制終止一個線程可能會使堆處於不一致的狀態,等等。 - 如果您需要終止線程,則需要立即中止應用程序。

希望你可以打電話給stopLongTermJob這樣的設置一些標誌來中斷dllFuncWithLongTermJob

然後:

auto obj = new Worker; 
auto objFuture = QtConcurrent::run([=]{obj->dllFuncWithLongTermJob();}); 

打斷:

obj->stopLongTermJob(); // must be thread-safe, sets a flag 
objFuture.waitForFinished(); 
+1

實際上,OP可能會這樣做,但這一切都取決於DLL的功能。如果dllFuncWithLongTermJob僅僅是一種無狀態的一次又一次運行的功能,那麼它可以在一個子進程中運行,可以在不對主程序造成嚴重後果的情況下終止進程。這只是使用操作系統來完成清理工作。毋庸置疑,這是最後的解決方案,我只會使用缺乏適當中斷的替代方案。 – odelande

+0

@odelande有更多的方式可以在單獨的過程中運行它。操作系統清理是一個部分,當然。另一個重要的部分是,當它突然終止時,dll不會破壞你的*狀態。在兒童流程中運行它實際上是一個絕妙的主意! –

+0

如果我理解正確 - 我需要使用QThread而不是QtConcurrent來控制子線程?在這種情況下併發不適用?那時我只是在MainWindow中實現了closeEvent等待對話框,如果子線程數!= 0x00。 –