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
    评论
### 回答1: PostMessageSendMessage 都是 JavaScript 中用来在不同窗口或框架之间进行通信的方法。 PostMessage 方法允许开发人员在两个不同域之间发送消息,而 SendMessage 方法则是在同一域之间发送消息。 这两种方法都可以在父窗口和子窗口之间进行通信,也可以在不同页面之间进行通信。 ### 回答2: postmessagesendmessage都是Windows API中的函数,用于在不同的应用程序之间发送消息。它们之间有一些区别postmessage函数是异步的,它会将消息放入目标窗口的消息队列中,并立即返回。这意味着,发送消息的线程不会等待目标窗口处理消息,而是继续执行自己的代码。这种异步的消息传递方式适用于需要快速发送消息并不需要等待结果的情况。 而sendmessage函数是同步的,它会直接调用目标窗口的消息处理函数,并等待这个函数返回后继续执行。这意味着,发送消息的线程会阻塞在sendmessage函数的调用上,直到目标窗口处理完消息并返回结果。这种同步的消息传递方式适用于需要及时获取结果的情况。 由于postmessage是异步的,所以在发送完消息后不能立即获得目标窗口的处理结果。如果需要知道消息处理的结果,可以使用sendmessage。但由于sendmessage是同步的,如果目标窗口的消息处理函数需要花费很长时间,那么发送消息的线程也会被阻塞同样长的时间。 在实际应用中,通常优先考虑使用postmessage,因为它具有较高的执行效率。只有在确实需要及时获取目标窗口的处理结果时,才使用sendmessage。另外,需要注意的是,对于跨进程的消息传递,只有sendmessage函数可以实现,而postmessage只能用于同一进程内的消息传递。 ### 回答3: postmessagesendmessage都是Windows API中的函数,用于在不同的窗口之间发送消息。 postmessage函数是发送异步消息的函数,它会将消息放入接收窗口的消息队列中,然后立即返回。该函数不会等待接收窗口处理完消息,而是继续执行后续的代码。这意味着发送的消息不会影响到发送窗口的执行流程。因此,postmessage适用于不需要立即得到响应的情况,比如向其他应用程序发送消息。 sendmessage函数则是发送同步消息的函数,它会将消息发送给接收窗口,并且会一直等待接收窗口处理完该消息后才会返回。这意味着发送消息的窗口必须等待接收消息的窗口处理完消息后才能继续执行后续的代码。因此,sendmessage适用于需要立即得到响应或需要对消息的处理结果进行判断的情况,比如向同一应用程序的其他窗口发送消息。 总结来说,postmessage是异步地发送消息,不等待接收窗口处理消息;sendmessage是同步地发送消息,等待接收窗口处理消息后才返回。选择使用哪个函数要根据具体的需求来决定。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值