关于消息的处理 (200分)

  • 主题发起人 主题发起人 子陵
  • 开始时间 开始时间

子陵

Unregistered / Unconfirmed
GUEST, unregistred user!
书里说:
"事件是串行的,每一个事件的处理都要等到前一个事件处理
完毕之后。当应用程序正在执行事件处理代码时(也就是说,当它没有处于等待事件状态
时),该应用程序的其他事件必须在该程序的消息队列中等待(除非应用程序使用多线程
处理,每个线程都有自己的消息队列)。[/red]当应用程序响应一条消息之后,返回等待
状态时,它将变成程序列表中的最后一位,等待着处理其他消息。在16位的WINDOWS中,
不能中断正在执行复杂事件处理程序的应用程序,其他应用程序必须等待。”

但是,如果在消息处理过程种如果有窗口产生或是连续发送同样的消息,
那么消息是怎样的呢?
谁能帮我解释一下,谢谢!
下面的源码就涉及到这个问题,自定义一个消息,在消息中showmessage,
在计时器中连续发送这个消息,为什么每个消息都被处理.而每个消息都没有被完全处理.
(也就是程序中为什么会有多个Message对话框出现,第一个消息并没有处理完)

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls;

const
SX_MSG=WM_USER+1;

type
TForm1 = class(TForm)
Timer1: TTimer;
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
procedure SXMsg(var msg:TMessage); message SX_MSG;
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
begin
Timer1.Enabled:=True;
end;

procedure TForm1.SXMsg(var msg: TMessage);
begin
ShowMessage('TEST');
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
PostMessage(Form1.Handle,SX_MSG,0,0);
end;

end.
 
每个消息在发送时
系统以为已经完成,至于是否被人为接收,并不一定需要结果。
 
我想你的疑问是:ShowMessage显示的是模式窗体,只有关闭后,ShowMessage才能返回,
这样主线程不能处理其它消息,不应出现程序运行的实际结果。
其实ShowMessage是VCL中一个显示模式窗体的过程,它调用了TForm类的ShowModal方法,
而在ShowModal中有一个处理应用程序消息的循环,调用Application.HandleMessage处理
消息,所以在模式窗体显示过程中应用程序还能继续处理消息队列中的消息,也就出现程
序运行的实际结果。
以上如还不清楚,可看VCL源码,便会明白。
 
谢谢两位
 
后退
顶部