代码之家  ›  专栏  ›  技术社区  ›  Jeff Barger

停止MFC线程

  •  2
  • Jeff Barger  · 技术社区  · 16 年前

    我了解直接终止线程(通过afxendthread或其他方法)的问题,我看到了使用cevent对象向线程发送信号,然后让线程自行清理的示例。我遇到的问题是,使用cevent向线程发送信号似乎需要一个循环,在该循环中检查线程是否在循环结束时发出信号。问题是,我的线程不循环。它只是运行,处理可能需要一段时间(这就是为什么我希望能够停止它)。

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

    3 回复  |  直到 16 年前
        1
  •  0
  •   cigarman    16 年前

    你的线曾经退出过吗?如果是这样,您可以在退出时在线程中设置一个事件,并让主进程通过waitForsingleEvent等待该事件。最好使用超时,这样主进程在关闭时就不会锁定。在超时事件中,通过afxkillthread终止线程。不过,您必须确定什么是合理的超时。

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

    如果线程从未退出,那么afxkillthread/afxterminatethread是停止线程的唯一方法。

        2
  •  2
  •   Brian R. Bondy    16 年前

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

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

        3
  •  0
  •   Goz    16 年前

    局部变量将被放置在堆栈上,因此,在强制关闭线程时将被释放(我认为)。不过,析构函数不会被调用,线程持有的任何关键部分也不会被释放。

    但是,如果线程只使用堆栈上的简单数据类型进行操作,那么这样做是安全的。