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, 
0 0 );
  
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, 
0 0 );
  
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.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值