在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;
};
};线程能够收到消息,正常结束,但是一结束,马上就报错了。不知道怎么回事?
{
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;
};
};线程能够收到消息,正常结束,但是一结束,马上就报错了。不知道怎么回事?
(一般情况)
m_hKill = ::CreateEvent(NULL, fALSE, FALSE, NULL);
UINT AVIThreadProc(LPVOID lpParam)
{
...
while ( ::WaitForSingleObject(m_hKill, 0) == WAIT_TIMEOUT)
{
}
}
要结束线程:
::SetEvent(m_hKill);
你的线程里面没有消息循环的话
PostThreadMessage会出错的
{
#ifdef _DEBUG
TRACE0("AVIThreadProc => begin\n");
#endif
...
while ( ::WaitForSingleObject(m_hKill, 0) == WAIT_TIMEOUT)
{
}
...
#ifdef _DEBUG
TRACE0("AVIThreadProc => end\n");
#endif
}
调试一下,看是否正常退出。
如果是,那就使其他代码的问题。