setmessage()&postmessage()
[问题]:
比如我在 OnButton1中写上:
void OnButton1()
{
::SetWindowText( this->GetSafeHwnd(), "abc" );
gEnableQuit = true; // gEnableQuit已经被volatile修饰过
}
我就觉得很奇怪 SetWindowText 使用的是 SendMessage(WM_TEXT),而 SendMessage 需要等待消息被处理后才返回,而此时又正在处理 WM_BUTTON1,不等处理完WM_BUTTON1它是不处理WM_TEXT的,可是不处理WM_TEXT的话,SendMessage就一直在等, 这就引起死锁。但事实上并没有死锁;假如这个OnButton1被另一个线程调用着,而此时用户发出了退出消息,退出代码如下:
OnDestroy
{
while( !gEnableQuit ) Sleep( 500 );
}
这就会引起死锁,原因就是我刚才所说的疑惑,在 SetWindowText 处死锁。
[解答]
PostMessage是把WM_XX送到消息队列中,而SendMessage根本不经过消息队列,其实就是直接Call 窗口对应的消息函数,下面是SendMessage的内核代码:
SendMessage(hWnd,message,wParam,lParam)
{
WNDPROC pPrevWndFunc = GetWindowLong(hWnd,GWL_WNDPROC);
return CallWndProc(pPrevWndFunc,hWnd,message,wParam,lParam);
}
因此,你OnButton1()模块中的SetWindowText(),直接调用了SendMessage,而SendMessage直接调用了WndProc()。子程序调用子程序,不存在所谓死锁的问题
[问题]:
比如我在 OnButton1中写上:
void OnButton1()
{
::SetWindowText( this->GetSafeHwnd(), "abc" );
gEnableQuit = true; // gEnableQuit已经被volatile修饰过
}
我就觉得很奇怪 SetWindowText 使用的是 SendMessage(WM_TEXT),而 SendMessage 需要等待消息被处理后才返回,而此时又正在处理 WM_BUTTON1,不等处理完WM_BUTTON1它是不处理WM_TEXT的,可是不处理WM_TEXT的话,SendMessage就一直在等, 这就引起死锁。但事实上并没有死锁;假如这个OnButton1被另一个线程调用着,而此时用户发出了退出消息,退出代码如下:
OnDestroy
{
while( !gEnableQuit ) Sleep( 500 );
}
这就会引起死锁,原因就是我刚才所说的疑惑,在 SetWindowText 处死锁。
[解答]
PostMessage是把WM_XX送到消息队列中,而SendMessage根本不经过消息队列,其实就是直接Call 窗口对应的消息函数,下面是SendMessage的内核代码:
SendMessage(hWnd,message,wParam,lParam)
{
WNDPROC pPrevWndFunc = GetWindowLong(hWnd,GWL_WNDPROC);
return CallWndProc(pPrevWndFunc,hWnd,message,wParam,lParam);
}
因此,你OnButton1()模块中的SetWindowText(),直接调用了SendMessage,而SendMessage直接调用了WndProc()。子程序调用子程序,不存在所谓死锁的问题