当前位置:  开发笔记 > 编程语言 > 正文

如何杀死MFC线程?

如何解决《如何杀死MFC线程?》经验,为你挑选了2个好方法。

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

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

如何在类析构函数中删除此线程?

我觉得有点像

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

然后设置m_bKillThreadFALSE在析构函数.但是我仍然需要在析构函数中等待,直到线程死亡.



1> Brian R. Bon..:

主动杀死线程:

使用返回值AfxBeginThread(CWinThread*)来获取线程句柄(m_hThread)然后将该句柄传递给TerminateThread Win32 API.这不是一种终止线程的安全方法,所以请继续阅读.

等待线程完成:

使用返回值AfxBeginThread (CWinThread*)来获取成员m_hThread,然后使用WaitForSingleObject(p->m_hThread, INFINITE); 如果此函数返回WAIT_OBJECT_0,则线程结束.而不是INFINITE你也可以在超时发生之前等待毫秒数.在这种情况下WAIT_TIMEOUT将返回.

向您的线程发信号通知它应该结束:

在做之前,WaitForSingleObject设置一些线程应该退出的标志.然后在线程的主循环中,您将检查该bool值并打破无限循环.在析构函数中,您将设置此标志然后执行WaitForSingleObject.

更好的方法:

如果您需要更多控制,您可以使用类似增强条件的东西.



2> plan9assembl..:

顺便说一句,关于TerminateThread(),以这种方式使用。

DWORD exit_code= NULL;
if (thread != NULL)
{
    GetExitCodeThread(thread->m_hThread, &exit_code);
    if(exit_code == STILL_ACTIVE)
    {
        ::TerminateThread(thread->m_hThread, 0);
        CloseHandle(thread->m_hThread);
    }
    thread->m_hThread = NULL;
    thread = NULL;
}

推荐阅读
pan2502851807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有