AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi TThread: Daten von Mainthread holen --> Synchronize notwendig?
Thema durchsuchen
Ansicht
Themen-Optionen

TThread: Daten von Mainthread holen --> Synchronize notwendig?

Ein Thema von Helmi · begonnen am 18. Dez 2024 · letzter Beitrag vom 18. Dez 2024
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.336 Beiträge
 
Delphi XE2 Professional
 
#11

AW: TThread: Daten von Mainthread holen --> Synchronize notwendig?

  Alt 18. Dez 2024, 17:46
Dann führst du das ReceiveString aber auch innerhalb des Locks aus, obwohl es dafür gar keinen Grund gibt. Besser ist es, wenn du alles fertig machst und dann nur noch in dem abgesicherten Teil die Zielvariable schreibst.

Denn je länger du Threads blockierst, desto eher übersiehst du mögliche Deadlocks, sprich dass sich zwei Threads gegenseitig blockieren, weil beide auf den anderen warten (z.B. einer im TMonitor.Enter, der andere in einem Synchronize, jetzt nur als Beispiel). Die Gefahr besteht hier nicht, aber trotzdem sollte man in einem Lock, sprich hier zwischen Enter und Exit, so wenig Code wie möglich ausführen.
ah ok - Danke für die Info.

Also dann eher so:

Delphi-Quellcode:
procedure TMainForm.Thread_UDP_ReceiveString(var Text: String);
var
  S: String;

begin
  S := '';

  If idUDPClient.Connected then
    S := IdUDPClient.ReceiveString(-1, TEncoding.UTF8);

  System.TMonitor.Enter(ClientThread);
  try
    Text := S;

  finally
    System.TMonitor.Exit(ClientThread);
  end;
end;
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#12

AW: TThread: Daten von Mainthread holen --> Synchronize notwendig?

  Alt 18. Dez 2024, 17:55
Ja, genau. Wie schon geschrieben:
Hier ist es nicht relevant, aber gewöhne es dir besser gleich so an.

Und manchmal stellt sich dann ja auch heraus, dass eine weitere Verarbeitung gar nicht nötig ist, man den Teil mit TMonitor also gar nicht ausführen muss. Das kann man dann vorher noch prüfen.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: TThread: Daten von Mainthread holen --> Synchronize notwendig?

  Alt 18. Dez 2024, 18:34
Jupp, prinzipiell kannst du dir dieses TMonitor wie eine CriticalSection vorstellen.
Außer dass du dir dort erst eine CriticalSection-Erstellen mußt und dann CS.Enter und CS.Leave nutzt.
Bei TMonitor ist dieser Speicherplatz/Instanz bereits in jedem einzelnen TObject integriert.

TThread.Synchronize und TThread.Queue lassen den jeweioligen Code im Hauptthread laufen.
Codes im Hauptthread sind bereits im Hauptthread und müssen natürlich nicht nochmal abgesichet werden.
Somit läuft jeder Zugriff nur noch im Hauptthread, also IMMER nur jeweils einer gleichzeitig und somit gibt es keine Konflikte.

SendMessage und PostMessage ... dort werden die Messages im Thread der Komponente ausgeführt (wo diese Komponente erstellt wurde) .... bei der VCL normal der Hauptthread.
Also auch hier wieder alles innerhalb des selben Threads und somit sicher.

Interlocked, bzw. Atomic, sowie LOCK im Assembler, blocken nur für diesen einen CPU-Befehl den Zugriff durch andere CPU-Kerne.
PS: Die Referenzzählung von Interfaces, Strings (LongStrings) und dynamischen Arrays nutzt das.



Und dann gibt noch brutalere Sachen ala TMREWSync/TMultiReadExclusiveWriteSynchronizer, für Dinge wo man oft liest (wenn es in sich thread-save ist) und seltener "unsicher" schreibt.
Mehrere können also gleichzeitig lesen, aber sobald EINER schreiben will, warten alle Anderen so lange.


Es gibt z.B. auch ThreadedList (normal oder als generic), wo man mit Add einfach "blind" reinschreiben kann (intern eine CriticalSection)
und beim Auslesen mal kurz "selbst" die Liste sperrt, im gesichert auf den Inhalt zuzugreifen.

Einige Implementationen bieten auch einfache Push- und Pop-Methoden, welche, wie Add, in sich abgesichert sind.
Einer/mehrere Threads schieben was rein ... einer/mehrere andere Threads holen sich war raus (falls es was gibt) ... und alles automatisch abgesichert.
$2B or not $2B

Geändert von himitsu (18. Dez 2024 um 18:44 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 00:34 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