博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
setmessage()&postmessage()
阅读量:4227 次
发布时间:2019-05-26

本文共 834 字,大约阅读时间需要 2 分钟。

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

转载地址:http://ixdqi.baihongyu.com/

你可能感兴趣的文章
VBox fdisk 不显示 添加的硬盘 解决方法
查看>>
Secure CRT 自动记录日志 配置 小记
查看>>
RMAN RAC 到 单实例 duplicate 自动分配通道 触发 ORA-19505 错误
查看>>
mysql 随机分页的优化
查看>>
DB2快速创建测试库
查看>>
SD卡驱动分析--基于高通平台
查看>>
[图文] Seata AT 模式分布式事务源码分析
查看>>
pm 源码分析
查看>>
kmsg_dump
查看>>
Getting a Result from an Activity
查看>>
Java多态性理解
查看>>
git学习网站
查看>>
JavaScript 学习网站
查看>>
cocos2dx java调用c++ -- 字符串传递
查看>>
CCScaleTo与CCScaleBy比较
查看>>
cocos2dx CCObject引用计数,内存释放分析(1)
查看>>
cocos2dx2.X 编译时,传递编译选项
查看>>
ccCArray.cpp 文件
查看>>
cocos2dx 屏幕大小
查看>>
lua 时间转化
查看>>