PostMessage与SendMessage
- 开始
- 当一个线程第一次被建立时,系统假定线程不会被用于任何与用户相关的任务。这样可以减少线程对系统资源的要求。但是,一旦这个线程调用一个与图形用户界面有关的函数(例如检查它的消息队列或建立一个窗口),系统就会为该线程分配一些另外的资源,以便它能够执行与用户界面有关的任务。特别是,系统分配一个THREADINFO结构,并将这个数据结构与线程联系起来。
- 这个THREADINFO结构包含一组成员变量,利用这组成员,线程可以认为它是在自己独占的环境中运行。
- 当一个线程调用GetMessage或WaitMessage,但没有对这个线程或这个线程所建立窗口的消息时,系统可以挂起这个线程,这样就不再给它分配CPU时间。当有一个消息登记或发送到这个线程,系统要设置一个唤醒标志,指出现在要给这个线程分配 CPU时间,以便处理消息
-
PostMessage
- 系统要确定是哪一个线程建立了用 hwnd参数标识的窗口
- 系统分配一块内存,将这个消息参数存储在这块内存中
- 将这块内存增加到相应线程的登记消息队列中
- 设置 QS_ POSTMESSAGE唤醒位
- 返回
- PostThreadMessage
- MSG结构的hwnd成员将设置成NULL
- 当程序要在主消息循环中执行一些特殊处理时要调用这个函数
- PostQuitMessage
- 不实际登记一个消息到任何一个THREADINFO结构的队列
- 设定QS_QUIT唤醒标志
- 设置THREADINFO结构的nExitCode成员
- SendMessage
- 同线程窗口:调用指定窗口的窗口过程,将其作为一个子例程
- 不同线程窗口:
- 发送的消息要追加到接收线程的发送消息队列,同时还为这个线程设定QS_SENDMESSAGE标志
- 当接收线程在等待消息时,系统首先检查 QS_SENDMESSAGE唤醒标志是否被设定,如果是,系统从发送消息队列中取出第一个消息并调用适当的窗口过程来处理消息
- 调用SendMessage的线程被设置成空闲状态(idle),等待一个消息出现在它的应答消息队列中
- 在发送的消息处理之后,窗口过程的返回值被登记到发送线程的应答消息队列中。发送线程现在被唤醒,取出包含在应答消息队列中的返回值。这个返回值就是调用SendMessage的返回值。
- 发送线程继续正常执行。
- 如果在接收线程发送消息队列中再没有消息了,则QS_SENDMESSAGE唤醒标志被关闭。
- 参考《Windows核心编程》