2012-08-02 62 views
0

所以,這是問題:多線程對象破壞MFC對話框

我已經寫了包裝類暴露簡化的API爲libtorrent C++庫。它(包裝器)有一個堆棧分配的成員,它是libtorrent的主會話對象。 庫本身使用boost框架及其線程化功能 - 它是多線程的。 (我必須說我並不是很熟悉boost。)

現在,我想創建一個簡單的基於MFC對話框的應用程序,它將具有用於管理會話,進度條等的幾個按鈕。

libtorrent會話的析構函數可能需要一段時間才能完成(因爲它需要通知跟蹤器它正在關閉)。用戶被提示退出時使用MessageBox來確認下載終止,所以我認爲將我的包裝器對象作爲應用程序類的成員而不是CDialog(包裝器析構器,因此會話將踢出在對話框關閉後)。 Libtorrent文檔還指出,在調用析構函數之前關閉諸如Windows之類的UI是一個好主意。

這裏有趣的部分 - 一切正常,直到我關閉對話框。該過程繼續活着幾秒鐘,然後崩潰與一些升壓相關的鎖/關鍵部分的東西(這是調試指出的地方,一些鎖定/釋放呼叫在其中一個升壓頭)...

編輯
似乎在關閉時,主窗口會執行一些線程檢查,並進入某種「不規則」狀態,導致提升失敗。我想某種「加入」是需要爲GUI線程,以等待其他線程終止...

如果有人明白我想在這裏解釋什麼,並有一些想法我在做什麼錯誤的,或者有這個概念的替代解決方案,我真的很感激它。
謝謝。

回答

0

好的,問題解決了。
我所做的只是我最初創建了一個動態包裝對象,並在doModal()返回後將其刪除。此時主線程阻塞,等待刪除操作結束,這基本上是直到libtorrent會話被破壞。但是,非動態對象的特有行爲仍然存在。

1

您可以等待Boost線程在退出之前加入。我有一個使用Boost線程的Output_Processor類。我通過一個隊列連接到它。一旦我想關閉應用程序,我會在其隊列中放入一個關閉命令。處理該命令後,Output_Processor線程返回。然後我的連接塊返回,應用程序的其餘部分可以優雅地關閉。

... 
_output_processor_queue->write(shutdown_command); 

// Wait for output processor thread to join. 
_output_processor_thread->join(); 

_output_processor_initialized = false; 
... 
+0

正如我所說,我在torrent文件庫中編寫了封裝。你的回答,與問題部分無關,表明我應該搞亂圖書館的來源,我敢肯定我不會去做。 Libtorrent應該注意自己加入線程。 – Less 2012-08-03 05:44:50