SendMessage与PostMessage

《windows核心编程》第26章详细的分析了窗口消息,让人豁然开朗。

 

学习小结:

1、消息队列分为Post消息队列、Send消息队列、虚拟输入消息队列和应答消息队列。

2、PostMessage是将消息发送到消息的线程队列然后返回。

3、SendMessage表面看是发送消息,等消息处理完毕后返回。实际上相对复杂一些,要分情况讨论:

    1)线程内SendMessage,是直接调用窗口消息处理子过程。类似函数调用。
    2)线程间SendMessage,消息会发送到消息处理线程的Send消息队列,发送线程等待结果。
        a) 消息处理函数可以通过ReplyMessage()提前回应发送线程
        b) 消息循环处理消息时,Send消息队列优先于Post消息队列
        c) 调用InSendMessage()可以判定是否线程间Send过来的消息,TRUE表示线程间Send过来的消息,FALSE表示是Post过来的消息或本线程内的Send消息

 

 

写个示例在消息处理函数处打上断点,可以从堆栈窗口上看到这些过程。

 

1、Post消息走的是Post消息队列

 

2、主线程内调用SendMessage和消息处理函数是在一个栈上。

 

3、其他线程调用的SendMessage是发送消息到处理线程的Send消息队列,由处理线程走消息循环处理。

 

Send消息队列优先于Post消息队列,不能直接从堆栈看出。
可如下处理:
1)在消息响应函数中输出日志,在post消息响应中sleep个2秒。
2)在主线程连续post 5次消息,在开5个辅助线程,线程函数中连续SendMessage 5次。
查看执行结果,能看到连续的SendMessage穿插在Post之间处理。得证。

 

转载于:https://www.cnblogs.com/shokey520/p/3756571.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值