Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Datenaustausch zwischen Thread und Hauptprogramm (https://www.delphipraxis.net/171742-datenaustausch-zwischen-thread-und-hauptprogramm.html)

mischo22 22. Nov 2012 15:23

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

Sir Rufo 22. Nov 2012 15:27

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 Delphi-Referenz durchsuchenTThread.Synchronize oder (neuere Versionen) Delphi-Referenz durchsuchenTThread.Queue an.

mischo22 23. Nov 2012 12:26

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?.

Bummi 23. Nov 2012 12:31

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.

Sir Rufo 23. Nov 2012 17:49

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
http://www.delphipraxis.net/171750-t...der-nicht.html

mischo22 4. Dez 2012 11:52

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:
function GetConneted(): Boolean
begin
  Result:=ComConnected; // Nicht Syncronisiert!!!
end;
Und hier liegt der Hase im Pfeffer!
Diese Übergabe ist nicht syncronisiert. Und nun?

mjustin 4. Dez 2012 12:08

AW: Datenaustausch zwischen Thread und Hauptprogramm
 
Zitat:

Zitat von mischo22 (Beitrag 1194257)

Code:
function GetConneted(): Boolean
begin
  Result:=ComConnected; // Nicht Syncronisiert!!!
end;
Und hier liegt der Hase im Pfeffer!
Diese Übergabe ist nicht syncronisiert. Und nun?

Ob das ein Problem in der Threadsicherheit darstellt, kann man mit diesem Codeausschnitt noch nicht klar sagen.

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.

mischo22 4. Dez 2012 13:21

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.

Sir Rufo 4. Dez 2012 15:15

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 21:18 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