首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

为什么DLL中线程中不能退出了?该怎么处理

2012-02-25 
为什么DLL中线程中不能退出了?操作步聚如下:1.在调用DLL接口时,创建一个线程,并在创建完后显示窗口handle

为什么DLL中线程中不能退出了?
操作步聚如下:
1.在调用DLL接口时,创建一个线程,并在创建完后显示窗口
handle = CreateThread(NULL, 0, _MessageManageThreadProc, NULL, 0, &dwID);
sleep(100);
ext_pInstallPluginDlg->ShowWindow(SW_SHOW);

2.线程函数中创建一个窗口,并加上消息循环
DWORD WINAPI _MessageManageThreadProc(LPVOID lpParam)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());

if (ext_pInstallPluginDlg->GetSafeHwnd() == NULL)
{
if (!ext_pInstallPluginDlg->Create(IDD_DIALOG_INSTALL_BACK))
return -1;

}

MSG msg;
while (TRUE)
{
int bRet = GetMessage( &msg, NULL, 0, 0 );
if (bRet == -1 || bRet==0 )
{
// handle the error and possibly exit
break;
}
else
{
TranslateMessage(&msg); 
DispatchMessage(&msg); 
}
}
return 0;

}

3.在DLL退出的时候,退出这个线程
::PostThreadMessage(dwID, WM_QUIT, 0, 0);
WaitForSingleObject(handle, INFINITE);

为什么WaitForSingleObject会死掉,线程函数明明已经return了。

[解决办法]
DllMain及其调用的函数中不能等待线程结束,因为线程加载和退出都要调用DllMain,而DllMain是同步函数,在前一次调用DllMain未返回之前不会再次调用,所以死锁。
[解决办法]
入口处 DisableThreadLibraryCalls

热点排行