关于Windows的SendMessage()的几个问题。

SendMessage()根据MSDN的描述,SendMessage()是直接调用窗口的过程函数,SendMessage()

发送的是非队列消息。


但这里面有两个问题困扰我很久。

1.直接调用函数的话,如果是其他进程/线程,那么这个函数的控制权归谁所有。

2.如果有多个进程/线程同时调用过程函数,那么这个过程函数需不需要进行线程同步?

首先第一个问题的答案是控制权归接受消息的线程所有。第二个问题的答案是不需要。

因为MSDN中是这么说的:

If the specified window was created by the calling thread, the window procedure is called immediately 

as a subroutine. If the specified window was created by a different thread, the system switches to that 

thread and calls the appropriate window procedure. Messages sent between threads are processed 

only when the receiving thread executes message retrieval code. The sending thread is blocked until 

the  receiving thread processes the message. However, the sending thread will process incoming non-

queued messages while waiting for its message to be processed.

中文翻译如下:

如果指定的窗口被调用SendMessage的线程创建,那么这个窗口函数会像子程序一样的被立即调用。

【重点1】如果指定的窗口不是被调用SendMessage的进程创建,那么系统会切换到那个线程(创建窗

体的线程)然后调用合适的窗口过程。【重点2】在线程之间发送的消息只有当接收线程执行获取消息代

码的时候才会被处理。发送消息的线程被阻塞直到接受线程处理这个消息(这个阻塞有两方面,一方面

是处理这个消息的时间,另一方面是可能正在处理其他的SendMessage发来的消息。)。然而,当等待

他发送的消息被处理时,发送线程将处理进入的非队列消息。


上面【重点1】解释了第一个问题,即过程的控制权归接收消息的线程所有。【重点2】解释了第2个问

题,即不需要线程同步。因为这么多个进程/线程不可能同时调用这个过程函数,当先前的SendMessage

还没有返回的时候,后面SendMessge的调用会被阻塞。

好了,两个主要问题解决了。

但还有个小问题。就是上面“然而”之后的话,有些模糊不清。

什么叫“发送线程将处理进入的非队列消息”,主要问题在于处理谁的非队列消息?

发送线程的,还是接收线程的?

经过测试,处理的是发送线程自己的。也就是说,当发送线程被SendMessage阻塞的时候,不会影响其

他程序给他SendMessage,SendMessage就可以理解成上面说的“获取消息的代码"了吧!


欢迎不吝赐教。谢谢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值