如果我的程序是多线程,工作线程完成一个任务会SendMessage一个自定义消息到主窗口,主窗口再做处理。
我的问题是当主窗口自己正在处理自己的任务时候,如果工作线程SendMessage给主窗口,主窗口是先放下自己的任务去处理该消息还是等自己的任务完成了再处理该消息?

解决方案 »

  1.   

    首先,发送的消息要追加到接收线程的发送消息队列,同时还为这个线程设定
    Q S _ S E N D M E S S A G E标志(后面将讨论)。其次,如果接收线程已经在执行代码并且没有等待
    消息(如调用G e t M e s s a g e、P e e k M e s s a g e或Wa i t M e s s a g e),发送的消息不会被处理,系统不能
    中断线程来立即处理消息。当接收进程在等待消息时,系统首先检查Q S _ S E N D M E S S A G E唤醒
    标志是否被设定,如果是,系统扫描发送消息队列中消息的列表,并找到第一个发送的消息。
    有可能在这个队列中有几个发送的消息。例如,几个线程可以同时向一个窗口分别发送消息。
    当发生这样的事时,系统只是将这些消息追加到接收线程的发送消息队列中。
    当接收线程等待消息时,系统从发送消息队列中取出第一个消息并调用适当的窗口过程来
    处理消息。如果在发送消息队列中再没有消息了,则Q S _ S E N D M E S S A G E唤醒标志被关闭。当
    接收线程处理消息的时候,调用S e n d M e s s a g e的线程被设置成空闲状态( i d l e),等待一个消息
    出现在它的应答消息队列中。在发送的消息处理之后,窗口过程的返回值被登记到发送线程的
    应答消息队列中。发送线程现在被唤醒,取出包含在应答消息队列中的返回值。这个返回值就
    是调用S e n d M e s s a g e的返回值。这时,发送线程继续正常执行。
    当一个线程等待S e n d M e s s a g e返回时,它基本上是处于空闲状态。但它可以执行一个任务:
    如果系统中另外一个线程向一个窗口发送消息,这个窗口是由这个等待S e n d M e s s a g e返回的线程所建立的,则系统要立即处理发送的消息。在这种情况下,系统不必等待线程去调用
    G e t M e s s a g e、Peek Message或Wa i t M e s s a g e。建议读读 "WINDOWS核心编程" 一书,网上应该有下载的