[gelöst] Serielle Schnittstellen in mehreren Threads

Für Fragen von Einsteigern und Programmieranfängern...

[gelöst] Serielle Schnittstellen in mehreren Threads

Beitragvon NoCee » 13. Okt 2017, 19:27 [gelöst] Serielle Schnittstellen in mehreren Threads

Hallo zusammen,
ich habe ein kleines Programm das mit seriellen Schnittstellen arbeitet
geschrieben. Dafür hab ich Synaser benutzt. Funktioniert auch soweit.
Leider ist meine ursprüngliche Programmstruktur ziemlich träge.
Jetzt stelle ich das gerade auf mehrere separat laufende Threads um.
Da ich mit Threads noch nicht viel gemacht habe, stellt sich mir eine Frage
bzw. jetzt euch:

Das Programm empfängt die seriellen Daten jeder Schnittstelle in einem eigenen Thread.
Die Telegramme sollen jetzt auf einer einzigen Schnittstelle weitergeleitet werden.
Darf ich aus einem separat laufenden Thread strings auf einer anderen Schnittstelle ausgeben?
Oder kann das in die Hose gehen?

Beim Zugriff auf Variablen ist mir die Thread Save Problematik klar.
Aber bei der Übergabe an die Betriebssystem API?
Der Kompiler schluckts aber ist das auch sicher?

Euch ein sonniges schönes Wochenende
Gruß
NoCee
Zuletzt geändert von NoCee am 18. Okt 2017, 14:49, insgesamt 1-mal geändert.
NoCee
 
Beiträge: 94
Registriert: 3. Mär 2011, 21:34
Wohnort: Ulm
OS, Lazarus, FPC: Win7 (L 1.0.8 FPC 2.6.2) | 
CPU-Target: 64Bit
Nach oben

Beitragvon kupferstecher » 13. Okt 2017, 22:38 Re: Serielle Schnittstellen in mehreren Threads

NoCee hat geschrieben:Darf ich aus einem separat laufenden Thread strings auf einer anderen Schnittstelle ausgeben?

Du möchtest aus einem Thread raus auf die Schnittstelle zugreifen, die über einen anderen Thread gelesen wird? Das wird Kollissionen erzeugen (sporadisch). Entweder blockierst du den empfangenden Thread während du auf der gleichen Schnittstelle sendest, oder besser du teilst jeder Schnittstelle einen Thread zu und übergibst die Strings per Warteschlange. Der Thread holt sich dann immer die Strings ab, wenn er mit Empfangen, bzw. der Empfangsabfrage, fertig ist.

Die verschiedenen Schnittstellen musst du gegeneinander nicht synchronisieren, d.h. bei pro Schnittstelle ein Thread, dürfen diese auch "gleichzeitig" senden.
kupferstecher
 
Beiträge: 66
Registriert: 17. Nov 2016, 11:52

Beitragvon braunbär » 13. Okt 2017, 23:38 Re: Serielle Schnittstellen in mehreren Threads

kupferstecher hat geschrieben:Du möchtest aus einem Thread raus auf die Schnittstelle zugreifen, die über einen anderen Thread gelesen wird?

Nein, davon hat er nichts geschrieben. Ich vermute schon, dass zum Senden eine andere Schnittstelle als zum Empfangen verwendet wird.

Prizipiell sehe ich bei dem, was du vor hast, keine Probleme.
Die Strings, die empfangen, aber nocht nicht gesendet worden sind, wirst du vermutlich in einer Fifo-Liste zwischenspeichern. Den Zugriff auf diese Liste musst du natürlich über critical sections absichern, damit nicht zwei Threads gleichzeitig auf die Liste zugreifen..
braunbär
 
Beiträge: 164
Registriert: 8. Jun 2017, 17:21

Beitragvon mschnell » 16. Okt 2017, 14:01 Re: Serielle Schnittstellen in mehreren Threads

Mehrere Threads machen eine Anwendung nur dann "schneller", wenn sie so viel Power braucht, dass es sich lohnt, die Arbeit auf mehrere CPUs zu verteilen.

Das ist bei Anwendungen mit serieller Schnittstelle quasi nie der Fall.

Bei Schnittstellen-Programmierung werden Threads verwendet um z.B. "Blocking Read" in einem Thread zu machen, um den Rest der Anwendung nicht zu blockieren.

Wenn man statt Threads ein "Busy Wait" verwendet, darf man sich nicht wundern, wenn die Anwendung zäh wird, b.z.w. gar nicht vernünftig läuft.

-Michael,
mschnell
 
Beiträge: 3155
Registriert: 11. Sep 2006, 09:24
Wohnort: Krefeld
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ) | 
CPU-Target: X32 / X64 / ARMv5
Nach oben

Beitragvon NoCee » 18. Okt 2017, 14:46 Re: Serielle Schnittstellen in mehreren Threads

So, ich hab das jetzt in einem eigenen Thread gemacht.
Die Daten liegen in einem Fifopuffer und der wird mittels critical sections
abgesichert
War jetzt zwar Mehraufwand, dafür funktioniert es sicher.

@ mschnell: Synaser ließt blockierend zumindest kenn ich das nicht anders,
und deshalb habe ich das mit Threads gemacht.

Danke für die Infos
NoCee
NoCee
 
Beiträge: 94
Registriert: 3. Mär 2011, 21:34
Wohnort: Ulm
OS, Lazarus, FPC: Win7 (L 1.0.8 FPC 2.6.2) | 
CPU-Target: 64Bit
Nach oben

• Themenende •

Zurück zu Einsteigerfragen



Wer ist online?

Mitglieder in diesem Forum: Google [Bot] und 1 Gast

porpoises-institution
accuracy-worried