所以,这是问题:多线程对象破坏MFC对话框
我已经写了包装类暴露简化的API为libtorrent C++库。它(包装器)有一个堆栈分配的成员,它是libtorrent的主会话对象。 库本身使用boost框架及其线程化功能 - 它是多线程的。 (我必须说我并不是很熟悉boost。)
现在,我想创建一个简单的基于MFC对话框的应用程序,它将具有用于管理会话,进度条等的几个按钮。
libtorrent会话的析构函数可能需要一段时间才能完成(因为它需要通知跟踪器它正在关闭)。用户被提示退出时使用MessageBox来确认下载终止,所以我认为将我的包装器对象作为应用程序类的成员而不是CDialog(包装器析构器,因此会话将踢出在对话框关闭后)。 Libtorrent文档还指出,在调用析构函数之前关闭诸如Windows之类的UI是一个好主意。
这里有趣的部分 - 一切正常,直到我关闭对话框。该过程继续活着几秒钟,然后崩溃与一些升压相关的锁/关键部分的东西(这是调试指出的地方,一些锁定/释放呼叫在其中一个升压头)...
编辑
似乎在关闭时,主窗口会执行一些线程检查,并进入某种“不规则”状态,导致提升失败。我想某种“加入”是需要为GUI线程,以等待其他线程终止...
如果有人明白我想在这里解释什么,并有一些想法我在做什么错误的,或者有这个概念的替代解决方案,我真的很感激它。
谢谢。
正如我所说,我在torrent文件库中编写了封装。你的回答,与问题部分无关,表明我应该搞乱图书馆的来源,我敢肯定我不会去做。 Libtorrent应该注意自己加入线程。 – Less 2012-08-03 05:44:50