C++ 如何杀死MFC线程?

C++ 如何杀死MFC线程?,c++,multithreading,mfc,C++,Multithreading,Mfc,我使用AfxBeginThread生成一个线程,它只是一个无限while循环: UINT CMyClass::ThreadProc( LPVOID param ) { while (TRUE) { // do stuff } return 1; } 如何在类析构函数中消除这个线程 我想大概 UINT CMyClass::ThreadProc( LPVOID param ) { while (m_bKillThread) { // do stuff

我使用
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
。但是我仍然需要在析构函数中等待线程死亡。

主动终止线程:

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

等待线程完成:

使用
AfxBeginThread
CWinThread*
)的返回值获取成员m_hThread,然后使用
WaitForSingleObject(p->m_hThread,INFINITE)
如果此函数返回
WAIT\u OBJECT\u 0
,则线程完成。您还可以设置超时发生前等待的毫秒数,而不是
INFINITE
。在这种情况下,将返回
WAIT\u TIMEOUT

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

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

更好的方法:


如果你需要更多的控制,你可以使用类似的东西

您必须等待线程完成所有操作

if(WaitForSingleObject(thread_handle, INFINITE) == WAIT_OBJECT_0) 
    ;//all right
else
    ;//report error
注意使用TerminateThread函数,这非常危险。

顺便说一句,关于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对象以释放其内存(因为我们有责任这么做)。

如果泄漏,必须调用:delete thread;发出前线程=NULL;