2012-08-02 63 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