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