关于SendMessage的有关问题
关于SendMessage的问题
我在子线程中需要通过回调函数显示一些数据到主窗体上
我是SendMessage投递的自定义消息给主窗体的,这样做试了下都没问题
但是现在有个问题是我如果关闭掉窗口,则会发现子线程在SendMessage后会卡死,应该是主线程OnDestroy后窗口句柄m_hWnd为NULL。。
因此我做了如下处理,
boo g_bQuit = false;
CRITICAL_SECTION g_CritSect;
InitializeCriticalSection(&g_CritSect);和DeleteCriticalSection(&m_CritSect);分别在类构造析构中调用了
//OnDestroy函数
void CManageSvrDlg::OnDestroy()
{
EnterCriticalSection(&g_CritSect);
g_bQuit = true; // 标识窗体被销毁
LeaveCriticalSection(&g_CritSect);
}
//回调函数如下(子线程中调用)
BOOL CManageSvrDlg::OutPutPipe(const char* csLogInfo, LPVOID lpParameter)
{
EnterCriticalSection(&g_CritSect);
if (g_bQuit)
return false;
SendMessage(uMsg, wParam,lParam); ////////////////////////
LeaveCriticalSection(&g_CritSect);
}
运行结果:
运行后通过输出log发现,如果OnDestroy先被调用程序就运行正常,但是如果是回调函数先被调用,则还是会卡在SendMessage函数。
问题:
请教下,该如何处理?我把回调函数中的SendMessage改成非阻塞的PostMessage就OK了;
请教下有没有其它的方法,不是很能理解,我既然OnDestroy中已经加锁了,照理来说如果先执行了回调函数,则窗体不是不应该被销毁掉吗,为啥还是无法SendMessage,还是说我的加锁不应该加在OnDestroy中
------解决方案--------------------
EnterCriticalSection(&g_CritSect);
if (g_bQuit)
return false;
SendMessage(uMsg, wParam,lParam); ////////////////////////
LeaveCriticalSection(&g_CritSect);
这个逻辑是有问题的
g_bQuit为真的话,没有释放临界区,会造成死锁
SendMessage如果某个参数无效(NULL),应该不会阻塞而是直接返回错误吧
------解决方案--------------------
错误的使用方式 却不总是错误.
我在子线程中需要通过回调函数显示一些数据到主窗体上
我是SendMessage投递的自定义消息给主窗体的,这样做试了下都没问题
但是现在有个问题是我如果关闭掉窗口,则会发现子线程在SendMessage后会卡死,应该是主线程OnDestroy后窗口句柄m_hWnd为NULL。。
因此我做了如下处理,
boo g_bQuit = false;
CRITICAL_SECTION g_CritSect;
InitializeCriticalSection(&g_CritSect);和DeleteCriticalSection(&m_CritSect);分别在类构造析构中调用了
//OnDestroy函数
void CManageSvrDlg::OnDestroy()
{
EnterCriticalSection(&g_CritSect);
g_bQuit = true; // 标识窗体被销毁
LeaveCriticalSection(&g_CritSect);
}
//回调函数如下(子线程中调用)
BOOL CManageSvrDlg::OutPutPipe(const char* csLogInfo, LPVOID lpParameter)
{
EnterCriticalSection(&g_CritSect);
if (g_bQuit)
return false;
SendMessage(uMsg, wParam,lParam); ////////////////////////
LeaveCriticalSection(&g_CritSect);
}
运行结果:
运行后通过输出log发现,如果OnDestroy先被调用程序就运行正常,但是如果是回调函数先被调用,则还是会卡在SendMessage函数。
问题:
请教下,该如何处理?我把回调函数中的SendMessage改成非阻塞的PostMessage就OK了;
请教下有没有其它的方法,不是很能理解,我既然OnDestroy中已经加锁了,照理来说如果先执行了回调函数,则窗体不是不应该被销毁掉吗,为啥还是无法SendMessage,还是说我的加锁不应该加在OnDestroy中
------解决方案--------------------
EnterCriticalSection(&g_CritSect);
if (g_bQuit)
return false;
SendMessage(uMsg, wParam,lParam); ////////////////////////
LeaveCriticalSection(&g_CritSect);
这个逻辑是有问题的
g_bQuit为真的话,没有释放临界区,会造成死锁
SendMessage如果某个参数无效(NULL),应该不会阻塞而是直接返回错误吧
------解决方案--------------------
错误的使用方式 却不总是错误.