在DLL里的一个方法里,CreateThread。__declspec(dllexport) DWORD ShowAVIWaitForm(UINT AVI, char* WaitText)
{
    AFX_MANAGE_STATE(AfxGetStaticModuleState()); try
{
 DWORD ID = 0;
                   //先建立一个窗口 
 CAVIWaitForm* pAVIForm = new CAVIWaitForm();
 pAVIForm->AVIID = AVI;
                   //显示出来
 SetWindowState(pAVIForm,IDD_WAIT);
         pAVIForm->m_Text.SetWindowText(WaitText);
                   //建立线程
 HANDLE Threadhandle = CreateThread(NULL,0,LPTHREAD_START_ROUTINE(AVIThreadProc),
 pAVIForm,0,&ID);
 if (Threadhandle != NULL)
 return ID;
 else
 return -1;
}
catch(...)
{
         return -1;
};
};
然后,我想把这个窗口关闭掉。就另外加了个方法:
__declspec(dllexport) BOOL CloseAVIWaitForm(DWORD ThreadID)
{
try
{
        PostThreadMessage(ThreadID, WM_QUIT, 0, 0);
return TRUE;
        //delete pAVIForm; }
catch(...)
{
         return FALSE;
};
};线程能够收到消息,正常结束,但是一结束,马上就报错了。不知道怎么回事?

解决方案 »

  1.   

    在AVIThreadProc中设置条件判断退出:
    (一般情况)
    m_hKill = ::CreateEvent(NULL, fALSE, FALSE, NULL);
    UINT AVIThreadProc(LPVOID lpParam)
    {
       ...
       while ( ::WaitForSingleObject(m_hKill, 0) == WAIT_TIMEOUT)
      {
       }
    }
    要结束线程:
    ::SetEvent(m_hKill);
      

  2.   

    msdn说得很明白
    你的线程里面没有消息循环的话
    PostThreadMessage会出错的
      

  3.   

    我估计是你的pAVIForm->m_Text的问题!
      

  4.   

    UINT AVIThreadProc(LPVOID lpParam)
    {
    #ifdef _DEBUG
    TRACE0("AVIThreadProc => begin\n");
    #endif
       ...
       while ( ::WaitForSingleObject(m_hKill, 0) == WAIT_TIMEOUT)
      {
       }
      ...
    #ifdef _DEBUG
    TRACE0("AVIThreadProc => end\n");
    #endif
    }
    调试一下,看是否正常退出。
    如果是,那就使其他代码的问题。