Einzelnen Beitrag anzeigen

peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
672 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Best Practice : ein Object in enem anderen Thread abfragen

  Alt 25. Jan 2019, 14:34
Lesen ist normalerweise problemlos möglich, wenn die entsprechende Variable byte oder boolean ist, da sind operationen auf jeden Fall "atomisch" (können von einem Thread-switch nicht unterbrochen werden). Bei Variablen, die 2 oder 4 bytes belegen sind Operationen nur atomisch, wenn die Addresse der Variablen entsprechend aligned ist (d.h. eine Potenz von 2 bzw. 4). Bei Feldern in einem Objekt oder globalen Variablen sorgt der Compiler für eine entsprechendes Alignment.

In deinem Fall sollte also ein Busy flag (Boolean) keine Probleme machen, solange Dir nicht irgendein Code das Datenmodul selbst unter dem Hintern wegschießt .

Allerdings gibt es da immer noch Fallen. Wenn Du ein Flag aus Thread A liest, welches von Thread B gesetzt oder gelöscht werden kann, kann der gelesene Wert schon veraltet sein, bevor Thread A ihn verarbeiten kann. Ob das ein Problem sein kann hängt von den Details deines Scenarios ab.

Normalerweise geht man wie folgt vor:

Thread B (der Hintergrundthread) hat eine Arbeitsschleife, die bei jeder Runde prüft, ob die Terminated property des Threads true ist. Wenn ja wie Schleife verlassen und der Thread beendet sich. Thread A kann dann ThreadB.Terminate aufrufen, um das Flag zu setzen, und dann ThreadB.Waitfor, um zu warten, bis der Thread sich beendet hat. Man sollte aber auf jeden Fall einen sinnvollen Timeout an Waitfor übergeben, sonst wartet ThreadA eventuell ewig, wenn sich B aufgehängt hat.
Peter Below

Geändert von peterbelow (25. Jan 2019 um 14:42 Uhr)
  Mit Zitat antworten Zitat