繁体   English   中英

如何杀死MFC线程?

[英]How to kill a MFC Thread?

我使用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_bKillThread设置为FALSE 但是我仍然需要在析构函数中等待,直到线程死亡。

主动杀死线程:

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

等待线程完成:

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

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

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

更好的方法:

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

BTW,关于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;
}

首先,你必须启动线程的方式,使MFC不会删除时,它的线程对象完成 ,为MFC线程默认设置是让您随心所欲把它们关掉删除自身。

   m_thread = AfxBeginThread(ThreadProc, this, THREAD_PRIORITY_NORMAL ,CREATE_SUSPENDED);
   m_thread->m_bAutoDelete = FALSE;
   m_thread->ResumeThread();

现在在线程中,您需要一种机制,调用者线程可以向其发送信号以结束自身。 有多种方法,一种是WaitForSingleObject来检查信号的状态,另一种方法是简单地向这个线程发送一条消息来结束自己。 这是优雅的结局,而不是杀死它。

当这个线程结束时(=退出线程函数,清理),你可以让主线程在它退出之前等待它完成。

     int wait = 2000 // seconds ( I am waiting for 2 seconds for worker to finish)
     int dwRes = WaitForSingleObject( m_thread->m_hThread, wait);
     switch (dwRes)
     {
     case WAIT_OBJECT_0:
         TRACE( _T("worker thread just finished") ); break;
     case WAIT_TIMEOUT:
         TRACE( _T("timed out, worker thread is still busy") ); break;
     }

注意设置上面的m_bAutoDelete = FALSE使我们在线程完成时仍然有一个有效的句柄,所以我们可以等待它。 你现在要做的最后一件事是删除CWinThread对象以释放它的内存(因为我们负责这样做)。

你必须等待,直到线程做所有的事情。

if(WaitForSingleObject(thread_handle, INFINITE) == WAIT_OBJECT_0) 
    ;//all right
else
    ;//report error

注意使用TerminateThread函数,这是非常危险的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM