![]() |
Datenaustausch zwischen Thread und Hauptprogramm
Hallo!
da die Hilfe mir nichts brauchbares ausgeworfen hat, hier meine Frage, die mich schon seit geraumer Zeit beschäftigt: Ich habe ein Programm, welches beim Start ein Thread startet. Dieser Thread soll eigenständig Daten von einer seriellen Schnittstelle abfragen bez. Senden. Dazu müssen zwischen Thread und Hauptprogramm Daten übertragen werden (Syncronisiert!). Dem Thread muss u.A. die COM-Port Parameter übergeben werden, und die Info, ob Connected werden soll Der Zhread muss nun beim Empfangen von bestimmten Daten seinerseits Werte zurück an das Hauptprogramm geben, z.B. ein Temperaturwert, der zuvor empfangen wurde. Es gibt nun drei Lösungsansätze: 1. Variablen liegen im Hauptsprogramm. Der Thread greift darauf zu. 2. Variablen liegen im Thread, deklariert im public Abschnitt 3. Variablen liegen im Thread, deklariert als "property" im public Abschnitt Wie gesagt, alles muss syncronisiert sein. Wie kann ich das am geschicktesten machen? Müssen Variablen auch syncronisiert werden oder nur Objekte? Vielen Dank schon mal vorab für eure Unterstützung. Grüße Michael |
AW: Datenaustausch zwischen Thread und Hauptprogramm
Jeder Speicherzugriff muss synchronisiert erfolgen.
Und alles was etwas speichern kann belegt halt Speicher :stupid: Die Thread-Klasse bietet dafür ![]() ![]() |
AW: Datenaustausch zwischen Thread und Hauptprogramm
Hallo!
Ja, das mit Syncronize kenne ich. Damit kann zumindest der Thread in variablen des hauptprogramms schreiben. Nur wie geht es umgekehrt?. |
AW: Datenaustausch zwischen Thread und Hauptprogramm
@mischo22
wenn der Thread synchronized liest und schreibt, braucht man kein umgekehrt. Aber vielleicht kann Sir Rufo noch mal die verriegelten Getter und Setter hier beschreiben. |
AW: Datenaustausch zwischen Thread und Hauptprogramm
oh männo ... immer ich, die lisa war noch gar nie niemals dran :mrgreen:
Gut das wir aktuell so einen Thread-Property Beitrag im Angebot haben ![]() |
AW: Datenaustausch zwischen Thread und Hauptprogramm
Die Funktionsweise von Getter/Setter sind wir bekannt, aber auch hier stellt sich die Frage:
Sind Getter/Setter automatisch syncronisiert? Ich denke nein! Beispiel: in der Thread-Klasse gibt es eine Variable "ComConnected", die signalisiert, dass der COM-Port connected wurde. Um diese Variable aus dem Hauptprogramm lesen zu können habe ich die TThread-Klasse um ein Property Connected erweitert. Dieser ruft ein Getter auf um den Wert aus der private-Variable "ComConnected" des Threads auszulesen und zu übergeben.
Code:
Und hier liegt der Hase im Pfeffer!
function GetConneted(): Boolean
begin Result:=ComConnected; // Nicht Syncronisiert!!! end; Diese Übergabe ist nicht syncronisiert. Und nun? |
AW: Datenaustausch zwischen Thread und Hauptprogramm
Zitat:
Wenn der Hauptthread die GetCinneted Funktion des Threads aufruft, kann der Hauptthread nur davon ausgehen, dass er soeben den in diesem Moment aktuellen Zustand (ComConnected) erhalten hat. Wenn der Hauptthread sich im weiteren Verlauf auf diesen Status verlässt, kann es im Thread inzwischen schon anders aussehen. (Hauptthread könnte in der falschen Annahme, der Thread sei immer noch ComConnected, in Probleme hineinlaufen wenn die Verbindung inzwischen getrennt wurde). Um das zu verhindern, müsste man den gesamten Codeblock im Hauptthread in eine Critical Section bringen... Es hilft nicht, einfach nur den Getter zu synchronisieren. Um zu beurteilen ob der Code threadsicher ist, kommt es auf den weiteren Ablauf der Kommunikation zwischen den Threads an. |
AW: Datenaustausch zwischen Thread und Hauptprogramm
Mit der Problematik, dass sich der Wert zwischenzeitlich ändern könnte, ist klar.
Das muss man entsprechend berücksichtigen. Mir geht es erstmal grundsätzlich um die Frage, ob das Programm stabil läuft. Ich hatte bei meinen ersten Versuchen oft das Problem, dass der Thread einen variable aktualisiert und gleichzeitig über eine Getter der Wert abgefragt wird. Konkret waren es real-Variablen. Da kamen manchmal seldsame Daten zustande, weil der Thread die variable schreibt (MSB) und der Getter liest. So war ein Byte der Real-Variable bereits vom Thread geschrieben, das andere Byte noch nicht. |
AW: Datenaustausch zwischen Thread und Hauptprogramm
@mischo22
Hast du dir den verlinkten Thread mal angeschaut? Im letzten Beitrag dort siehst du wie die Properties threadsafe gemacht werden. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:43 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