[gelöst] Serielle Schnittstellen in mehreren Threads

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
NoCee
Beiträge: 170
Registriert: Do 3. Mär 2011, 21:34
OS, Lazarus, FPC: WinXp/7/10 Opensuse13.2/Leap15.3 (L 2.2.0 FPC 3.2.2 )
CPU-Target: Intel 32/64Bit, ARM9
Wohnort: Ulm

[gelöst] Serielle Schnittstellen in mehreren Threads

Beitrag von NoCee »

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 Mi 18. Okt 2017, 15:49, insgesamt 1-mal geändert.

Benutzeravatar
kupferstecher
Beiträge: 418
Registriert: Do 17. Nov 2016, 11:52

Re: Serielle Schnittstellen in mehreren Threads

Beitrag von kupferstecher »

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.

braunbär
Beiträge: 369
Registriert: Do 8. Jun 2017, 18:21
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10, FPC 3.2.0
CPU-Target: 64Bit
Wohnort: Wien

Re: Serielle Schnittstellen in mehreren Threads

Beitrag von braunbär »

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

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Serielle Schnittstellen in mehreren Threads

Beitrag von mschnell »

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,

NoCee
Beiträge: 170
Registriert: Do 3. Mär 2011, 21:34
OS, Lazarus, FPC: WinXp/7/10 Opensuse13.2/Leap15.3 (L 2.2.0 FPC 3.2.2 )
CPU-Target: Intel 32/64Bit, ARM9
Wohnort: Ulm

Re: Serielle Schnittstellen in mehreren Threads

Beitrag von NoCee »

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

Antworten