AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Datenaustausch zwischen Thread und Hauptprogramm

Ein Thema von mischo22 · begonnen am 22. Nov 2012 · letzter Beitrag vom 4. Dez 2012
Antwort Antwort
mischo22

Registriert seit: 23. Mär 2006
9 Beiträge
 
#1

Datenaustausch zwischen Thread und Hauptprogramm

  Alt 22. Nov 2012, 16:23
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
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Datenaustausch zwischen Thread und Hauptprogramm

  Alt 22. Nov 2012, 16:27
Jeder Speicherzugriff muss synchronisiert erfolgen.
Und alles was etwas speichern kann belegt halt Speicher

Die Thread-Klasse bietet dafür Delphi-Referenz durchsuchenTThread.Synchronize oder (neuere Versionen) Delphi-Referenz durchsuchenTThread.Queue an.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
mischo22

Registriert seit: 23. Mär 2006
9 Beiträge
 
#3

AW: Datenaustausch zwischen Thread und Hauptprogramm

  Alt 23. Nov 2012, 13:26
Hallo!

Ja, das mit Syncronize kenne ich.
Damit kann zumindest der Thread in variablen des hauptprogramms schreiben.
Nur wie geht es umgekehrt?.
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#4

AW: Datenaustausch zwischen Thread und Hauptprogramm

  Alt 23. Nov 2012, 13:31
@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.
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: Datenaustausch zwischen Thread und Hauptprogramm

  Alt 23. Nov 2012, 18:49
oh männo ... immer ich, die lisa war noch gar nie niemals dran

Gut das wir aktuell so einen Thread-Property Beitrag im Angebot haben
http://www.delphipraxis.net/171750-t...der-nicht.html
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
mischo22

Registriert seit: 23. Mär 2006
9 Beiträge
 
#6

AW: Datenaustausch zwischen Thread und Hauptprogramm

  Alt 4. Dez 2012, 12:52
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?
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#7

AW: Datenaustausch zwischen Thread und Hauptprogramm

  Alt 4. Dez 2012, 13:08

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.
Michael Justin
  Mit Zitat antworten Zitat
mischo22

Registriert seit: 23. Mär 2006
9 Beiträge
 
#8

AW: Datenaustausch zwischen Thread und Hauptprogramm

  Alt 4. Dez 2012, 14:21
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.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

AW: Datenaustausch zwischen Thread und Hauptprogramm

  Alt 4. Dez 2012, 16:15
@mischo22

Hast du dir den verlinkten Thread mal angeschaut?

Im letzten Beitrag dort siehst du wie die Properties threadsafe gemacht werden.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Antwort Antwort


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 08:25 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