不同线程之间向对方的窗口发送消息

    第二次阅读了Jeffrey Richter先生的<<windows核心编程>>窗口消息部分后,写了篇读书笔记,相同诸位共享,其中有一些不太明白的地方,望各位指出。下面是正文。

  如果A线程向B线程创建的窗口发送消息,无论AB线程是否同处于同一个进程,都采用相同的处理方式。

  如果AB线程处于不同的进程,A线程不可能处理B线程的窗口消息,因为发送线程不是运行在接收进程的地址空间中,因此不能访问相应窗口过程的代码和数据。

  如果AB线程处于相同的进程呢?此时A线程虽然可以访问B线程的窗口过程的,也可以调用某些窗口过程,但这样就不是通过发送消息种方法了。对于B线程的窗口,它只能从B线程的消息队列中获取消息,B线程窗口的处理过程可以在A线程中,但是消息却必须从B的消息队列中获取。我这样理解是否正确?

A线程向B线程创建的窗口发送消息时,处理方式如下:

  第一, 发送的消息要追加到B线程的发送消息队列(send-message queue),同时会为B线程设定QS_SENDMESSAGE标志。

  第二,B线程将有两种行为:

  a) B线程正执行代码,没有等待消息,则发送的消息不会立即被处理,系统不能中断线程来立即处理该消息(这意味着系统强壮,线程之间不会相互影响对方)

  b) B线程正等待消息,此时系统会检查B线程的唤醒标志,如果检查到唤醒标志含有QS_SENDMESSAGE,则会从B线程的发送消息队列中取出第一个消息(可能有多个,可能有多个线程同时向B线程发送了消息),然后唤醒B线程处理该消息,直到处理完所以的消息。然后关闭QS_SENDMESSAGE标志,挂起。

 第三 A线程发送消息后(使用SendMessage),它有两种行为:

  a) 处于挂起状态(即不会立即从SendMessage函数中返回)A线程会等待一个消息出现在它的应答消息队列中。这是由OS来做的,在B线程处理完A线程发送给它的窗口的消息后,该窗口过程的返回值会被OS登记到A线程的消息队列,相应标志位被设置,然后A线程被唤醒,从应答消息队列中取出该返回值,作为SendMessage的返回值返回给A线程。

  b) 当A处于挂起状态时,C线程向A线程的窗口发送一个消息,则系统要立即处理发送的消息。在这种情况下,系统不必等待线程去调用GetMessage、PeekMessage或WaitMessage。是系统处理该发送消息还是A线程的窗口处理过程处理该发送消息?如果是后者,这是否意味着发送消息处理完毕后A线程又被挂起?A线程会被唤醒么?
 未完,待续。
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值