Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Serial Worker angehalten in WaitSleepJoin (Thread Safty)
Omit
myCSharp.de - Member

Avatar #avatar-2748.jpg


Dabei seit:
Beiträge: 146

Themenstarter:

Serial Worker angehalten in WaitSleepJoin (Thread Safty)

beantworten | zitieren | melden

Hallo,

Ich habe einen Worker Thread der in einer dauerschleife eine Queue nach Nachrichten abfrägt. Der Zugriff auf die Queue über enqueue und dequeue ist bei locks umschlossen. Die Queue ist der einzigste was beide Threads nutzen. Der GUI Thread stellt Nachrichten in die Queue und der Worker Thread holt Sie aus der Queue.

In dem Worker Thread verwende ich einen System.IO.Ports.SerialPort. Das ist kein Thread Safe Objekt.
Ich verwende keine Events! Ich checke ob Daten da sind in der Endlosschleife, wenn Daten da sind lese ich diese Daten. Der GUI Thread verwendet den SerialPort nicht.

Einigen Minuten nach dem Start wird der Worker Thread unterbrochen und wird in den WaitSleepJoin Status versetzt. Ich bekomme das Problem nicht in den Griff. Vielleicht ist es der SerialPort, aber das ist nur ein Gedanke.

Kannst du mir helfen das hinzubekommen? Danke und noch einen schönen Tag!

Gruß Timo

Edit: Hab die Nachricht übersetzt.
Zitat
Hello,

I have a Worker Thread looping and reading from a Queue the access (enqueue and dequeue) to the Queue is surrounded by a lock. This is the only part both Threads(Gui and Worker) are accessing. The Gui Thread enqueues a Message Worker Thread dequeues it.

In the Worker Thread I'm using a System.IO.Ports.SerialPort. This is a not Thread Safe Object.
I don't use the Events! I check on Data in the Loop and if there is any Data I read it. The GUI Thread doesn't use this serialPort.

After a few Time after execution the Worker Thread gets suspended in the WaitSleepJoin Mode. I don't get the Problem. Perhaps it is the SerialPort but just a thought.

Can you help me to get this right? Thank you and have a nice day!

Gruß Timo

p.S. Sorry hab gerade gemerkt das ich ja auf einem deutschen Forum schreib. Wenn es wen stört übersetze ich das noch. Aber jetzt erstmal Freundin am Bahnhof abholen. Auch wenn mein Englisch zu grauenhaft ist. *g
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Omit am .
private Nachricht | Beiträge des Benutzers
ujr
myCSharp.de - Experte



Dabei seit:
Beiträge: 1770

beantworten | zitieren | melden

Hallo,
Zitat von Omit
After a few Time after execution the Worker Thread gets suspended in the WaitSleepJoin Mode.

Woher weißt Du das? Und wo genau ist das Problem?
SerialPort in einem eigenen Thread ist kein Problem, aber ohne Code lässt sich dazu sonst nichts sagen. Naja - außer, vielleicht, dass Read blockiert bis Daten kommen oder ein Timeout abgelaufen ist.

Zitat von Omit
p.S. Sorry hab gerade gemerkt das ich ja auf einem deutschen Forum schreib.
...
Auch wenn mein Englisch zu grauenhaft ist

Etwas mehr Sorgfalt täte schon gut.
private Nachricht | Beiträge des Benutzers
Omit
myCSharp.de - Member

Avatar #avatar-2748.jpg


Dabei seit:
Beiträge: 146

Themenstarter:

beantworten | zitieren | melden

Hallo ujr!
Zitat
Woher weißt Du das?
Weil ich im Thread-Objekt nach dem unterbrechen der Anwendung nachgeschaut habe.
Zitat
Und wo genau ist das Problem?
Das Problem ist, dass ich dann keine Nachrichten mehr über den SerialPort schicken kann, weil der Worker nicht mehr reagiert.
Zitat
Naja - außer, vielleicht, dass Read blockiert bis Daten kommen oder ein Timeout abgelaufen ist.
Das könnte der Hinweis gewesen sein, den ich brauche. Ich werde morgen mal den Quelltext dagegen abdichten. Danke!
Zitat
Etwas mehr Sorgfalt täte schon gut.
Ok habe es übersetzt!

Danke für deine Antwort und noch einen schönen Abend.
Gruß Timo
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Omit am .
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

beantworten | zitieren | melden

Hallo Omit,

dein Vorgehen mit der Queue ist sehr ungünstig. Verwende besser SyncQueue <T> - Eine praktische Job-Queue. Möglicherweise löst das nebenbei das eigentliche Problem.

herbivore
private Nachricht | Beiträge des Benutzers
Omit
myCSharp.de - Member

Avatar #avatar-2748.jpg


Dabei seit:
Beiträge: 146

Themenstarter:

beantworten | zitieren | melden

Hallo,

@herbivore!
Danke für deine Antwort, danke für deine Antwort. Ich werde deine generische SyncQueue meiner globalen Infrastruktur hinzufügen. So was braucht man ja immer wieder. Danke.

Das Problem lag wirklich an dem ReadByte. Es kommt an dem Port nur eine Nachricht als Antwort an, wenn ich auch was wegschicke! Deswegen kam der Worker nicht mehr aus dem Read raus, weil er nichts mehr weggeschickt hat.

Danke und Gruß Timo
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Omit am .
private Nachricht | Beiträge des Benutzers
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 7559
Herkunft: Waidring

beantworten | zitieren | melden

Hallo,
Zitat
Ich werde deine generische SyncQueue meiner globalen Infrastruktur hinzufügen.
Wenn du .net 4.0 verwendest ist mit der BlockingCollection<T> schon was dabei - obwohl es sich für das Verständnis durchaus lohnt die SyncQueue "auseinander zunehmen" ;-)


mfG Gü
Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
private Nachricht | Beiträge des Benutzers
Omit
myCSharp.de - Member

Avatar #avatar-2748.jpg


Dabei seit:
Beiträge: 146

Themenstarter:

beantworten | zitieren | melden

Hallo,

danke. Werde ich mir merken. Arbeite aber noch mit dem 3.5. Erst das nächste Projekt, dass ich Anfange werde ich wohl in 4.0 machen.

Gruß Timo
private Nachricht | Beiträge des Benutzers