停止 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 线程的主要内容,如果未能解决你的问题,请参考以下文章