我的Java方面博客

天下难事必做于易,天下大事必做于细

常用链接

统计

最新评论

PostMessage和SendMessage区别

PostMessage 只是把消息放入队列,不管其他程序是否处理都返回,然后继续执行 ;
SendMessage 必须等待其他程序处理消息后才返回,继续执行。
PostMessage
的返回值表示 PostMessage 函数执行是否正确 ;
SendMessage 的返回值表示其他程序处理消息后的返回值。
使用这两个发送消息函数的最重要的是要看你的程序是否要对消息的滞后性关注否 ,PostMessage 会造成消息的滞后性 , SendMessage 则不会 , 但如果 SendMessage 消息处理失败 , 则会造成程序停止 !

为了让大家能清楚的看到他们的效果,可以用下面的代码进行测试:
unit Unit1;

interface

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

type
  TForm1 
= class(TForm)
    mmo1: TMemo;
    btn2: TButton;
    btn3: TButton;
    procedure btn2Click(Sender: TObject);
    procedure btn3Click(Sender: TObject);
  
private
    
{ Private declarations }
    procedure testPostMessage;
    procedure testSendMessage;
  
public
    
{ Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses uFile;

{$R *.dfm}
var
  f: TFile;

procedure TForm1.btn2Click(Sender: TObject);
var
  i: Integer;
begin
  testPostMessage;
  
for i := 0 to 5000 do
  begin
    mmo1.Lines.Add(IntToStr(i)
+'======');
  end;
end;

procedure TForm1.btn3Click(Sender: TObject);
var
  i: Integer;
begin
  testSendMessage;
  
for i := 0 to 5000 do
  begin
    mmo1.Lines.Add(IntToStr(i)
+'======');
  end;
end;

procedure TForm1.testPostMessage;
var
  i: Integer;
begin
  PostMessage(f.Handle, WM_TEST, 
00);
  
for i := 0 to 5000 do
  begin
    mmo1.Lines.Add(IntToStr(i))
  end;
end;

procedure TForm1.testSendMessage;
var
  i: Integer;
begin
  SendMessage(f.Handle, WM_TEST, 
00);
  
for i := 0 to 5000 do
  begin
    mmo1.Lines.Add(IntToStr(i))
  end;
end;

initialization
  
if f = nil then
    f :
= TFile.Create;

finalization
  
if f <> nil then
    FreeAndNil(f);;

end.


unit uFile;

interface

uses
  Classes, Windows, Forms, Messages;

const
  WM_TEST 
= WM_USER + 1;

type
  TFile 
= class
  
private
    FHandle: HWND;
  
protected
    procedure WndProc(var Msg: TMessage);
  
public
    procedure AfterConstruction; override;
    procedure BeforeDestruction; override;
    property Handle: HWND  read FHandle;
  end;

implementation

{ TFile }

procedure TFile.AfterConstruction;
begin
  inherited;
  FHandle :
= AllocateHWnd(WndProc);
end;

procedure TFile.BeforeDestruction;
begin
  inherited;
  DeallocateHWnd(FHandle);
end;

procedure TFile.WndProc(var Msg: TMessage);
begin
  
if msg.Msg = WM_TEST then
  begin
    
//消息处理内容
    Application.MessageBox('WM_TEST''WM_TEST'0);
  end;  
  windows.DefWindowProc(FHandle, Msg.Msg, Msg.wParam, Msg.lParam);
end;

end.

posted on 2007-09-03 14:28 张树坤 阅读(1484) 评论(0)  编辑  收藏 所属分类: Windows编程


只有注册用户登录后才能发表评论。


网站导航: