Laden...

Serial Worker angehalten in WaitSleepJoin (Thread Safty)

Erstellt von Omit vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.825 Views
Omit Themenstarter:in
143 Beiträge seit 2008
vor 12 Jahren
Serial Worker angehalten in WaitSleepJoin (Thread Safty)

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.

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

U
1.688 Beiträge seit 2007
vor 12 Jahren

Hallo,

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.

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.

Omit Themenstarter:in
143 Beiträge seit 2008
vor 12 Jahren

Hallo ujr!

Woher weißt Du das?

Weil ich im Thread-Objekt nach dem unterbrechen der Anwendung nachgeschaut habe.

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.

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!

Etwas mehr Sorgfalt täte schon gut.

Ok habe es übersetzt!

Danke für deine Antwort und noch einen schönen Abend.
Gruß Timo

49.485 Beiträge seit 2005
vor 12 Jahren

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

Omit Themenstarter:in
143 Beiträge seit 2008
vor 12 Jahren

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

6.911 Beiträge seit 2009
vor 12 Jahren

Hallo,

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!"

Omit Themenstarter:in
143 Beiträge seit 2008
vor 12 Jahren

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