c++ - 如何杀死 MFC 线程?

标签 c++ multithreading mfc

我使用 AfxBeginThread 生成一个线程,它只是一个无限循环:

UINT CMyClass::ThreadProc( LPVOID param )
{
  while (TRUE)
  {
      // do stuff
  }
  return 1;
}

如何在我的类析构函数中终止这个线程?

我觉得有点像

UINT CMyClass::ThreadProc( LPVOID param )
{
  while (m_bKillThread)
  {
      // do stuff
  }
  return 1;
}

然后在析构函数中将m_bKillThread设置为FALSE。但是我仍然需要在析构函数中等待,直到线程死掉。

最佳答案

主动杀死线程:

使用 AfxBeginThread 的返回值 (CWinThread*) 获取线程句柄 (m_hThread) 然后将该句柄传递给 TerminateThread Win32应用程序接口(interface)。不过,这不是终止线程的安全方法,因此请继续阅读。

等待线程完成:

使用AfxBeginThread(CWinThread*)的返回值获取成员m_hThread,然后使用WaitForSingleObject(p->m_hThread, INFINITE); 如果此函数返回 WAIT_OBJECT_0,则线程结束。除了 INFINITE 之外,您还可以设置超时发生前等待的毫秒数。在这种情况下,将返回 WAIT_TIMEOUT

向您的线程发出结束信号:

在执行 WaitForSingleObject 之前,只需设置线程应该退出的某种标志。然后在线程的主循环中,您将检查该 bool 值并打破无限循环。在您的析构函数中,您可以设置此标志,然后执行 WaitForSingleObject

更好的方法:

如果你需要更多的控制,你可以使用像boost conditions这样的东西.

关于c++ - 如何杀死 MFC 线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/590792/

相关文章:

c++ - 检测可移动驱动器(例如 USB 闪存驱动器)C/C++

java - 在单向链表中添加双向链表节点

multithreading - Goroutines - 为什么我只在最后看到并排执行

c++ - GetComputerNameW 导致 Windows 10 中的缓冲区溢出

javascript - 如何使用 mfc/c++ 在 chrome 或 firefox 中注入(inject)脚本

c++ - CDaoRecordSet 从列中选择所有

c++ - Boost XML - 获取下一个节点

c++ - 从 C++ 中的二进制文件中读取 32 位整数?

java - 在哪些架构/操作系统中,其他线程可以在构造函数调用后看到默认的非最终字段值?

Java Thread.stop() 与 Thread.interrupt()