Einzelnen Beitrag anzeigen

Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#27

AW: CriticalSections wie verwenden?

  Alt 28. Nov 2010, 02:15
warum funktioniert dann folgendes
http://www.delphipraxis.net/156304-v...ml#post1064523
#26

wenn hier der zugreifende die CS ignoriert, bwz eine ander nimmt bekommt er Zugriff die der Intention der CS wiederspricht.
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
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (28. Nov 2010 um 02:19 Uhr)
  Mit Zitat antworten Zitat