Timer? Doch, geht. Eine CriticalSection blockt zuverlässig alles ab, was da rein will - unabhängig davon, wo es herkommt.
Hab mal eine kleine Demo gebaut(D2010):
Es kommt 2x "enter", das Programm läuft natürlich in einer Endlosschleife.
Wo liegt mein Denkfehler?
Delphi-Quellcode:
var
CritcalSection: TCriticalSection;
implementation
{$R *.dfm}
procedure TForm6.Button1Click(Sender: TObject);
begin
Timer1.Enabled := True;
CS;
end;
procedure TForm6.CS;
begin
CritcalSection.Enter;
try
OutputDebugString('enter');
while True do
begin
Application.ProcessMessages;
sleep(100);
end;
finally
CritcalSection.Leave;
OutputDebugString('leave');
end;
end;
procedure TForm6.Timer1Timer(Sender: TObject);
begin
Timer1.Enabled := False;
CS;
end;
initialization
CritcalSection := TCriticalSection.Create;
finalization
CritcalSection.Free;
end.