所以,这就是问题所在:
我编写了一个包装类,为libtorrent c ++库提供了简化的API。它(包装器)有一个堆栈分配的成员,它是libtorrent的主会话对象。 库本身使用boost框架及其线程功能 - 它是多线程的。 (我必须说我对提升并不熟悉。)
现在,我想创建一个简单的基于MFC对话框的应用程序,它将有几个用于管理会话,进度条等的按钮。
libtorrent会话的析构函数可能需要一段时间才能完成(因为它需要通知跟踪器它正在关闭)。退出时会通过MessageBox提示用户确认下载终止,所以我认为将我的包装器对象作为app类的成员而不是CDialog(包装器析构函数,因此会话将会踢)是个好主意。在对话框关闭后) Libtorrent文档还声明,在调用析构函数之前关闭诸如windows之类的UI是个好主意。
这里有趣的部分 - 一切正常,直到我关闭对话框。这个过程继续存在几秒钟,然后崩溃了一些与boost相关的锁/关键部分(调试器指向的位置,一个boost / release中的一些锁定/释放调用)......
修改
似乎在关闭时,从主窗口执行一些线程检查,并且它进入某种“不规则”状态,在这种状态下,它会使升压失败。我认为gui线程需要某种“连接”,等待其他线程终止...
如果有人理解我在这里要解释的内容,并且知道我做错了什么,或者对这个概念有另一种解决方案,我真的很感激。
感谢。
答案 0 :(得分:1)
您可以在退出之前等待Boost线程加入。我有一个使用Boost线程的Output_Processor类。我通过队列接口。一旦我想关闭应用程序,我就在其队列中放入一个shutdown命令。处理该命令后,Output_Processor线程返回。然后我的块加入返回,应用程序的其余部分可以正常关闭。
...
_output_processor_queue->write(shutdown_command);
// Wait for output processor thread to join.
_output_processor_thread->join();
_output_processor_initialized = false;
...
答案 1 :(得分:0)
好的,问题解决了。
我所做的就是我最初创建了一个动态包装器对象,并在doModal()返回后删除它。此时主线程阻塞,等待删除操作结束,这基本上直到libtorrent会话被破坏。然而,非动态对象的特殊行为仍然存在。