停止 MFC 线程

Posted

技术标签:

【中文标题】停止 MFC 线程【英文标题】:Stopping an MFC thread 【发布时间】:2009-12-16 16:13:41 【问题描述】:

我理解直接终止线程(通过 AfxEndThread 或其他方式)的问题,并且我已经看到使用 CEvent 对象向线程发出信号然后让线程自行清理的示例。我遇到的问题是,使用 CEvent 向线程发出信号似乎需要一个循环,您可以在其中检查线程是否在循环结束时发出信号。问题是,我的线程没有循环。它只是运行,处理可能需要一段时间(这就是我希望能够停止它的原因)。

另外,如果我只是杀死线程,我意识到我分配的任何东西都没有机会自行清理。在我看来,我一直使用的任何当地人碰巧把东西放在堆上也将无法清理自己。是这样吗?

【问题讨论】:

【参考方案1】:

这里没有神秘的魔法知识。

只需在整个函数代码中定期检查事件对象,您认为可以安全退出。

【讨论】:

【参考方案2】:

你的线程曾经退出吗?如果是这样,您可以在退出时在线程中设置一个事件,并让主进程通过 waitforsingleevent 等待该事件。这最好与超时有关,这样主进程在关闭时似乎不会锁定。在超时事件中,通过 AfxKillThread 杀死线程。不过,您必须确定合理的超时时间。

由于您不在线程中循环,因此在我看来这是唯一的方法。当然,您可以在主进程中设置一个布尔标志并让线程定期检查此标志,但是您的线程代码将被“if(!canRun) return;”类型代码。

如果线程永远不会退出,那么 AfxKillThread/AfxTerminateThread 是停止线程的唯一方法。

【讨论】:

【参考方案3】:

Locals 将被放置在堆栈上,因此,将在强制线程关闭时被释放(我认为)。但是不会调用析构函数,并且线程持有的任何关键部分都不会被释放。

但是,如果线程只在堆栈上处理简单数据类型的事情,那么这样做是安全的。

【讨论】:

以上是关于停止 MFC 线程的主要内容,如果未能解决你的问题,请参考以下文章

如何正确的关闭 MFC 线程

如何在 mfc 的 OnCreate 方法中停止创建窗口

具有动态创建控件的 MFC 应用程序突然停止响应

MFC/VC下控制windows服务——停止服务,启动服务

如果我从常规 DLL 加载 MFC DLL,反序列化将停止工作

VS2008执行MFC程序,提示microsoft incremental linker已停止工作解决方法