MFC线程中使用AfxMessageBox事项(别在线程中使用AfxMessageBox)

不要在线程中使用AfxMessageBox,原因我觉得有两个:1.阻塞 2.关闭AfxMessageBox后主线程就直接结束了.

例如:
在一个线程函数中这样写

<!-- lang: cpp -->
UINT WINAPI CXXX::ChildThread(LPVOID pData)
{
     //................
 AfxMessageBox("子线程结束");
    //...................
}
//在某个函数中创建线程
void CXXX::OnOK()
{
    UINT uiThreadID1;
    HANDLE hThreadProc = (HANDLE)_beginthreadex( NULL, 0, ChildThread, this, 0, &uiThreadID1 );
    if ( hThreadOrderProc )
    {
        ::CloseHandle(  hThreadOrderProc );
    }
 }

这样会导致:
1.AfxMessageBox下面的代码阻塞.
2.如果CXX是一个对话框的话,关闭AfxMessageBox, 对话框CXX也会关闭
所以别在线程中使用AfxMessageBox.

如果在线程中要弹对话框的话,可以通过PostMessage给主对话框Post消息,来进行弹,还有就是不要把界面上的东西放到线程中,界面是显示也是UI线程控制的.

把线程线程中的AfxMessageBox改成:

<!-- lang: cpp -->
::PostMessage(m_hWnd, WM_MESSAGEBOX, NULL, NULL);

你的线程函数可能是静态函数,获取句柄要通过存储句柄的方式来获得

<!-- lang: cpp -->
std::vector<HWND>   CXXX::m_WndVec;
for ( int i = 0; i < m_WndVec.size(); i ++ )
{
    HWND hWnd = m_WndVec.at( i );
    if ( ::IsWindow( hWnd ) )
    {
        CXXX* pDlg = (CXXX*)CWnd::FromHandle( hWnd );
        ::PostMessage(hWnd, WM_MESSAGEBOX, NULL, NULL);
    }
}

关于关闭UI线程:
因为UI线程有消息队列,所以结束一个UI线程最好的方法是发一个WM_QUIT消息给消息队列,方法很多如:PostQuitMessage(),PostThreadMessage()等等。但是发出消息后最好等待看UI线程是否已经退出.

<!-- lang: cpp -->
// 主线程结束UI线程的代码
if(pThread) 
{
   // 1. 发一个WM_QUIT 消息结 UI 线程
   pThread->PostThreadMessage(WM_QUIT, NULL, NULL);         
   // 2. 等待 UI 线程正常退出
   if (WAIT_OBJECT_0 == WaitForSingleObject(pThread->m_hThread, INFINITE))
  {
    // 3. 删除 UI 线程对象,只有当你设置了m_bAutoDelete = FALSE; 时才调用
    delete   pThread; 
  }
}

你可能感兴趣的:(MFC线程中使用AfxMessageBox事项(别在线程中使用AfxMessageBox))