![]() |
Delphi-Version: 10.2 Tokyo
TThread.synchronize atomar?
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 |
AW: TThread.synchronize atomar?
Zitat:
Delphi-Quellcode:
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.
Synchronize
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. |
AW: TThread.synchronize atomar?
Zitat:
|
AW: TThread.synchronize atomar?
Zitat:
Eigentlich sollte die Methode FühreIrgendwelchenCodeAusDerWasAuchImmerMachenKann UndDenGanzenProgrammablaufUnvorhersehbarMacht heißen. |
AW: TThread.synchronize atomar?
Zitat:
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. |
AW: TThread.synchronize atomar?
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:
Timer und Buttons doppelt anklicken (oder den unteren Quellcode vorher in die PAS einfügen)
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 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 |
AW: TThread.synchronize atomar?
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.
|
AW: TThread.synchronize atomar?
Das Problem mit
Delphi-Quellcode:
tritt ja auch ganz ohne Threads auf.
Application.ProcessMessages
|
AW: TThread.synchronize atomar?
Zitat:
Ah, 333, in Issus große Keilerei :lol: Irgendwie treffend. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:22 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz