Das läuft im HauptThread
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
tc:Cardinal;
begin
FCS.Enter;
txt := 'Button1';
tc := GetTickCount;
while GetTickCount < (tc + 5000) do Application.ProcessMessages;
Showmessage(txt);
FCS.Leave;
end;
Das im Thread (also in einem anderen Thread als der HauptThread)
Delphi-Quellcode:
procedure TMyThread.Execute;
begin
inherited;
FCS2.Enter;
txt := 'Thread';
FCS2.Leave;
end;
Das Perverse daran ist, das funktioniert tatsächlich ... aber das hier würde auch funktionieren:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
tc:Cardinal;
begin
txt := 'Button1';
tc := GetTickCount;
while GetTickCount < (tc + 5000) do Application.ProcessMessages;
Showmessage(txt);
end;
procedure TMyThread.Execute;
begin
inherited;
txt := 'Thread';
end;
Erst wenn der HauptThread und der Thread
gleichzeitig schreibend/lesend oder schreibend/schreibend auf die Variable txt zugreifen, erst dann und nur dann gibt es einen Zugriffsfehler.
Die CS ist nicht dazu da, dass es
überhaupt funktioniert, sondern dass es
immer funktioniert.
Allerdings wirst du bei diesem COde es wahrscheinlich niemals eine Zugriffsverletzung bekommen, da der Thread ja nur einen winzigen Moment läuft und genau diesen Zeitpunkt müsstest du treffen, um eine Zugriffsverletzung zu provozieren.
Nach dem Klicken von dem Button für das Starten des Threads, vergeht aber mehr Zeit, bis die Form wieder Eingaben zulässt, als der Thread mit der abarbeitung von Execute benötigt ... darum brauchst du hier gar keine CS, weil der Zustand so gesehen niemals eintrifft