AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TThread.synchronize atomar?

Ein Thema von Olli73 · begonnen am 18. Aug 2022 · letzter Beitrag vom 18. Aug 2022
Antwort Antwort
Benutzerbild von Olli73
Olli73

Registriert seit: 25. Apr 2008
Ort: Neunkirchen
755 Beiträge
 
#1

TThread.synchronize atomar?

  Alt 18. Aug 2022, 15:45
Delphi-Version: 10.2 Tokyo
Hallo!

Läuft die Prozedur in "TThread.Synchronize(nil, procedure ...)" im Hauptthread atomar ab oder kann da ein anderer Thread durch synchronize "dazwischen grätschen"?

LG
Olli
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#2

AW: TThread.synchronize atomar?

  Alt 18. Aug 2022, 16:09
Läuft die Prozedur in "TThread.Synchronize(nil, procedure ...)" im Hauptthread atomar ab oder kann da ein anderer Thread durch synchronize "dazwischen grätschen"?
In einem Thread läuft immer alles atomar ab, wobei das hier der falsche Ausdruck ist. Da kann nichts dazwischen grätschen (wenn man von Hardware Interrupts und ähnlichem absieht). Synchronize setzt bildlich gesprochen ein Flag das der Hauptthread zyklisch abprüft und den entsprechenden Code ausführt. Der aufrufende Thread wartet solange. Wenn mehrere Threads ein Synchronize aufrufen (jeder kann nur eins), werden die im Hauptthread sequentiell abgearbeitet - wie alles in einem Thread.

Von atomar spricht man im Zusammenhang mit Zugriff auf gemeinsame Ressourcen (z.B. einer Variable). Hier gilt eine Operation als atomar, wenn sie durch keinen anderen Thread unterbrochen werden kann, womit das Resultat verfälscht werden könnte.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Olli73
Olli73

Registriert seit: 25. Apr 2008
Ort: Neunkirchen
755 Beiträge
 
#3

AW: TThread.synchronize atomar?

  Alt 18. Aug 2022, 16:16
Wenn mehrere Threads ein Synchronize aufrufen (jeder kann nur eins), werden die im Hauptthread sequentiell abgearbeitet - wie alles in einem Thread.
Danke. Das "sequentiell" ist für mich das Entscheidende. Der Codeblock (die anonyme Prozedur) wird also am Stück ausgeführt und nicht durch Code von anderen Threads mit Synchronize unterbrochen.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#4

AW: TThread.synchronize atomar?

  Alt 18. Aug 2022, 16:47
Der Codeblock (die anonyme Prozedur) wird also am Stück ausgeführt und nicht durch Code von anderen Threads mit Synchronize unterbrochen.
Ja, wenn nicht innerhalb des Codeblocks sowas wie Application.ProcessMessages aufgerufen wird - auch nicht indirekt. Aber sowas macht heutzutage ja keiner mehr...

Eigentlich sollte die Methode FühreIrgendwelchenCodeAusDerWasAuchImmerMachenKann UndDenGanzenProgrammablaufUnvorhersehbarMacht heißen.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#5

AW: TThread.synchronize atomar?

  Alt 18. Aug 2022, 17:36
Der Codeblock (die anonyme Prozedur) wird also am Stück ausgeführt und nicht durch Code von anderen Threads mit Synchronize unterbrochen.
Ja,


AUßER, du lässt zu, dass sowas gemacht werden darf.


z.B. Application.ProcessMessages; aufrufen,
ebenso innerhalb einen ShowModal, ShowMessage/MessageBox oder nahezu allem Anderen, worin angefallene Messages verarbeitet werden.

Aber hier hält dann auch wieder dein Hauptthrad dort an und die Anderen laufen darin sequentiell ab.


ps: In einem ButtonClick eine Schleife, darin Application.ProcessMessages und schon kannst du innerhalb des OnClicks nochmal auf den Button klicken usw.
$2B or not $2B

Geändert von himitsu (18. Aug 2022 um 17:41 Uhr) Grund: na soooo langsam bin ich nu auch nicht ... grade eben war die letzte Antwort noch nicht da o_O
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#6

AW: TThread.synchronize atomar?

  Alt 18. Aug 2022, 18:20
Dort, wo du jetzt auf den Button klicken kannst, da könnte auch ein Synchronize rein kommen.

Text kopieren und im FormDesigner einer neuen VCL-Form ein beherztes Strg+V
Code:
object Timer1: TTimer
  OnTimer = Timer1Timer
  Left = 56
  Top = 24
end
object Button1: TButton
  Left = 40
  Top = 88
  Caption = 'Button1'
  TabOrder = 0
  OnClick = Button1Click
end
object Button2: TButton
  Left = 40
  Top = 128
  Caption = 'Button2'
  OnClick = Button2Click
end
object Memo1: TMemo
  Left = 160
  Top = 40
  Width = 345
  Height = 297
  ScrollBars = ssVertical
end
Timer und Buttons doppelt anklicken (oder den unteren Quellcode vorher in die PAS einfügen)
und die Funktionen mit folgendem ersetzen
Delphi-Quellcode:
var gutesC: Integer; // oder als Private in die Form

procedure TForm1.Button1Click(Sender: TObject);
begin
  Inc(gutesC);
  var C := gutesC;
  Memo1.Lines.Add('Button1-Start ' + C.ToString);
  for var i := 0 to 15 do begin
    Memo1.Lines.Add('Button ' + C.ToString + ' ' + i.ToString);
    Sleep(333);
    Application.ProcessMessages;
  end;
  Memo1.Lines.Add('Button1-Ende ' + C.ToString);
end;

var bösesI: Integer; // oder als Private in die Form
procedure TForm1.Button2Click(Sender: TObject);
begin
  Inc(gutesC);
  var C := gutesC;
  Memo1.Lines.Add('Button2-Start ' + C.ToString);
  repeat
    Inc(bösesI);
    Memo1.Lines.Add('Button ' + C.ToString + ' ' + bösesI.ToString);
    Sleep(333);
    Application.ProcessMessages;
  until bösesI mod 15 = 0;
  Memo1.Lines.Add('Button2-Ende ' + C.ToString);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Memo1.Lines.Add('Timer');
end;

Codes ab Delphi 10.irgendwas
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von Olli73
Olli73

Registriert seit: 25. Apr 2008
Ort: Neunkirchen
755 Beiträge
 
#7

AW: TThread.synchronize atomar?

  Alt 18. Aug 2022, 18:32
Danke für den Hinweis auf ProcessMessages. Das mache ich zum Glück hier nicht. Ich hatte nur zusätzlich das Ganze mit TMonitor.Enter(...) innerhalb des Synchronize abgesichert - das ist dann ja unnötig.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#8

AW: TThread.synchronize atomar?

  Alt 18. Aug 2022, 19:45
Das Problem mit Application.ProcessMessages tritt ja auch ganz ohne Threads auf.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.960 Beiträge
 
Delphi 12 Athens
 
#9

AW: TThread.synchronize atomar?

  Alt 18. Aug 2022, 22:46

Ah, 333, in Issus große Keilerei
Irgendwie treffend.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:45 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz