Einzelnen Beitrag anzeigen

Benutzerbild von nicodex
nicodex

Registriert seit: 2. Jan 2008
Ort: Darmstadt
286 Beiträge
 
Delphi 2007 Professional
 
#9

Re: Wie schnell ist SendMessage?

  Alt 15. Mai 2009, 09:46
Zitat von himitsu:
Und SendMessage wird nicht sofort ausgeführt.
Dann erkläre bitte, warum WM_BAR ankommt, während die Behandlung von WM_FOO noch nicht abgeschlossen ist:
Delphi-Quellcode:
unit Unit1;

interface

uses
  { Delphi Win }
  Windows,
  Messages,
  { Delphi RTL }
  SysUtils,
  Classes,
  { Delphi VCL }
  Controls,
  StdCtrls,
  Forms;

const
  WM_FOO = WM_USER + 42;
  WM_BAR = Succ(WM_FOO);

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    FFoo: Integer;
    procedure WmFoo(var AMessage: TMessage); message WM_FOO;
    procedure WmBar(var AMessage: TMessage); message WM_BAR;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  FFoo := 0;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  SendMessage(Handle, WM_FOO, 0, 0);
end;

procedure TForm1.WmFoo(var AMessage: TMessage);
begin
  InterlockedIncrement(FFoo);
  try
    SendMessage(Handle, WM_BAR, 0, 0);
  finally
    InterlockedDecrement(FFoo);
  end;
end;

procedure TForm1.WmBar(var AMessage: TMessage);
begin
  MessageBox(Handle, PChar('Foo: ' + IntToStr(FFoo)), 'Bar', MB_OK or
    MB_ICONINFORMATION);
end;

end.
ps: Deswegen sollte man auch mit Application.ProcessMessages() vorsichtig sein (bzw. sich über dessen Wirkung im Klaren sein).
  Mit Zitat antworten Zitat