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就可以理解成上面说的“获取消息的代码"了吧!
欢迎不吝赐教。谢谢!