setmessage()&postmessage()

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()。子程序调用子程序,不存在所谓死锁的问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值