Multithread Problem

CodeFatal

Erfahrenes Mitglied
Hallo,

ich arbeite momentan an einem Multithreaded Problem und hab da nen böses Problem.

Aber erstmal zu dem was ist.
Ich habe eine Dialogfeldbasierende MFC-Anwendung und zwei mit AfxBeginThread erstellte Worker Thread routinen.
Diesen Routinen übergebe ich beim Start einen zeiger auf eine Daten struktur.
In dieser STruktur ist unteranderem ein Zeiger auf eine CListCtrl zu Debug und Ausgabezwecken.

Jeder zugriff ist durch eine Critical Section geschützt, sodass ich immer nur einen Zugriff gleichzeitig starten kann...So zu mindest der Plan:)

Dummerweise klappt das aber wohl nicht ganz. Wenn der eine Thread sich schlafen gelegt hat, und der andere schreiben will passiert es leider viel zu oft, das die Funktion CListCtrl::InsertItem(...) nicht zurück kommt.

Hat jemand nen Plan warum?
Hab mir schon überlegt, ob ich ne Message an den Entsprechenden Parent Dlg schicken soll und von da aus die Ausgabe aber eigentlich ist das nicht das was ich möchte.

Danke schon mal für eure Antworten.

Gruss Michael
 
So ich hab jetzt länger mit den threads gespielt und bin immer noch nicht wirklich weiter:-(

Mit meinem Latein bin ich schon lange zuende, aber vielleicht könnt ihr mir doch noch nen Typ geben. Ich öffne einen ComPort einmalig zu Beginn des Programms und greife in den Threads auf diesen geöffneten ComPort mit Readfile und Writefile zyklisch zu. wäre es evt besser den Port nur zu öffnen, wenn ich ihn wirklich brauche und danach zu schliessen oder ist das bereits implementierte der bessere Weg?

Gruss Michael
 
Könnte es sein, das vielleicht wenn es zum lesen geöffnet wurde, nicht auf dieses ComPort schreiben kann, sodass es beim lesen den Zugriff sperrt solange das lesen beendet wird oder so?
 
nAbend,

Genau wegen dieser Idee gibt es ja die CriticalSection um "paralelle"prozesse zu synchronisieren.

Wie ich soeben rausgefunden habe ist aber das Problem wohl darin mit begründet, das der Zieldongle nicht schnell genug umschaltet.
D.h. wenn der WriteThread wieder schreibend auf den Port zugreifen dürfte, muss dies noch für 300ms verzögert werden... dann es zumindest.

Falls jemand noch nen paar heisse tips zum umgang mit threads hat. Ich könnt se wirklich brauchen.

Gruss Michael
 
Ich bin mir nicht sicher, ob 'Critical Section' da das Richtige ist. Du könntest auch eine Semaphore verwenden.
 
Moin moin,
inzwischen alles,

Wichtig war das der ReadFile nicht wartet bis was gesendet wurde, sondern sofort zurückkehrt -> COMMTIMEOUTS müssen richtig initialisiert werden.

Die Verzögerung lag in einem Design Fehler der Software auf der antwortenden Hardware.

Ist soweit allso jetzt alles im grünen Bereich.

Sind hinter der CriticalSection nicht irgendwo Semaphoren :confused:
Funktionieren tut es auf jedenfall
Gruss Michael
 
Da sie laut MSDN schneller sein sollen als Mutices und Semaphoren denke ich, das da keine Semaphoren dahinterstehen. Von der Funktionalität werden sie dort mit Mutices verglichen.
Aber den Quellcode kenne ich natürlich nicht, daher weiß ich nicht, wie sie implementiert sind.
 
Den kennen vermutlich auch nur noch wenige :)

Hatte auch nur die Vermutung, da ich in einem anderen Projekt ebenfalls CriticalSections verwendet habe und bei irgendeinem blöden Fehler meiner Seits nen Absturz wegen fehlerhaftem Semaphoren-Zugriff bekam.

Aber es funktioniert wie gesagt.
Danke für die Antworten

Gruss Michael
 
Zurück