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).