主程序退出时会卸载加载的dll,怎么安全退出dll内创建的线程

主程序退出时会卸载加载的dll,如何安全退出dll内创建的线程
主程序退出时会卸载加载的dll,如何安全退出dll内创建的线程

纠结好长时间了,望高人指点。谢谢!代码片段如下:




CMyDialog* pDlgTest = NULL;
CWinThread* pWinThreadUI = NULL;
CWinThread* pWinThreadTimer = NULL;

UINT WINAPI ThreadProcUI( LPVOID pParam ) 
{
pDlgTest = new CMyDialog();
pDlgTest->Create(IDD_MyDialog);
pDlgTest->ShowWindow(SW_SHOW);

MSG msg;// 消息循环
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}

// 线程退出时清理资源
// 没有正常退出线程时不会执行到这里
pDlgTest->DestroyWindow();
delete pDlgTest;
pDlgTest =NULL;

AfxMessageBox("UI线程正常退出。"); 

return 0
}

UINT ThreadProcTimer( LPVOID pParam ) 
{
// 启动一些定时器



MSG msg;// 消息循环
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}

return 0
}


DWORD WINAPI ThreadProcMain( LPVOID pParam ) 
{
//////////////////////////////////////////////////////////////////////////
// 启动UI线程
pWinThreadUI = AfxBeginThread(ThreadProcUI, NULL);

//////////////////////////////////////////////////////////////////////////
// 启动定时器线程
pWinThreadTimer = AfxBeginThread(ThreadProcTimer, NULL);

return 0
}

BOOL CNGApp::InitInstance()
{
CWinApp::InitInstance();

//////////////////////////////////////////////////////////////////////////
HANDLE hTread = CreateThread(NULL, 0, ThreadProcMain, NULL, 0, NULL);
CloseHandle(hTread);

//////////////////////////////////////////////////////////////////////////
return TRUE;
}

int CNGApp::ExitInstance()
{
// 这里每次发送消息都失败,好像运行到这里前面创建的线程已经被强制退出了,在pDlgTest对话框上面加个按钮,按钮事件里面发送退出消息,可以正常执行
if (pWinThreadUI->PostThreadMessage(WM_QUIT, NULL, NULL))
{
WaitForSingleObject(pWinThreadUI->m_hThread, INFINITE);
}

//////////////////////////////////////////////////////////////////////////
return CWinApp::ExitInstance(); 
}



------解决方案--------------------
dll导出一个函数,通知线程退出并等待
主程序退出前,先调用这个函数
------解决方案--------------------
在dll的detach事件里处理呗。

------解决方案--------------------
探讨
引用:

dll导出一个函数,通知线程退出并等待
主程序退出前,先调用这个函数


谢谢。


主程序exe无法修改,我想让主程序加载这个dll的时候初始化dll,主程序退出的时候卸载dll时能安全退出dll里面的线程,有其他办法吗?

------解决方案--------------------
dll被卸载会在dllmain中通过参数通知,你可以在哪里做文章呀,

------解决方案--------------------
dllmain加载卸载都会被调用.自己处理.
------解决方案--------------------
HANDLE hTread = CreateThread(NULL, 0, ThreadProcMain, NULL, 0, NULL);
没这个必要吧?
直接调用ThreadProcMain不行吗?
------解决方案--------------------
主程序退出时会卸载加载的dll,如何安全退出dll内创建的线程?
对于这个问题,主程序在卸载加载的dll之前,会通知这个dll, 
主程序在卸载dll时会以这两个参数DLL_THREAD_DETACH,DLL_PROCESS_DETACH来调用DllMain这个函数,
你可以在这个时候释放所有的资源。