Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

Hallo zusammen!

Die Vorgeschichte:

Ich hab ein Programm, das die Daten vom COM-Port einliest. Das Gerät, das die Daten schickt kann zwei verscheidene Zustände haben: Master und Slave.

Wenn ich mein Programm starte und das Gerät sagt, der ist Master alles OK.

Wenn das Gerät sagt aber, dass es Slave ist, muss ich alle paar Sekunden nachsehen, ob er vielleicht doch in Masterzustand übergegangen ist und die Daten als Master sendet.

Mein Problem:

Ich habe 3 Threads, die mit AfxBeginThread() aufgerufen werden:

Der eine ist für die Abfrage Master/Slave, der dann den einen von den anderen beiden Thread startet: entweder Masterthread oder Slavethread.

Aus dem SlaveThread rufe ich den Abfragethread alle paar Sekunden wieder auf, um zu sehen ob es doch Master ist(AbfrageThread liest die Daten eine bestimmte Zeit ein und wertet diese aus, die Zeit wird mit SetTimer() gesteuert).

Für die Zeit, wo der AbfrageThread arbeitet, sollte der SlaveThread angehalten werden -> WIE MACHE ICH DAS BLOS?

Die Thread werden alle in der View abgearbeitet, da es eine Dialoganwendung ist mit FormView.

Habe schon mit CEvent und Lock()/Unlock() versucht, da hängt aber das Program an der gleichen Stelle und tut nichts!

WaitForSingleObject hilft mir auch nicht weiter, da das ganze Programm aufgehalten wird.

Bin sehr dankbar, wenn mir jemand helfen kann.

Geschrieben
Für die Zeit, wo der AbfrageThread arbeitet, sollte der SlaveThread angehalten werden -> WIE MACHE ICH DAS BLOS?
Indem du für die Abfrage eben keinen Thread verwendest?

Threads sind dafür da, dass man nicht darauf warten muss, dass eine Operation abgeschlossen wird, sondern schon mal weitermachen kann. Aber genau das willst du doch nicht. Du willst doch warten. Also starte die Abfrage nicht als Thread, sondern ruf sie direkt auf.

Geschrieben

Hallo,

Wenn ich für die Abfrage eine Funktion und nicht Thread benutze, hängt sich mein kompletes Programm auf!

Ich will ja nur den SlaveThread, der die Daten am Port verwaltet, anhalten, um Port frei zu kriegen, und nicht das ganze Programm!

Geschrieben

Hallo,

ich meine mich unter QT daran erinnern zu können, dass man Threads, so fern man den Zeiger auf den Thread hat, ihn "schlafen" legen kann. Evtl könntest Du aus Deinem "Master-Thread" zu Beginn, alle Slave Thread "schlafen" legen, dann den Code vom Master ausführen und am Ende die Slaves wieder aufweckst.

Ich würde am hier einmal Dein Konzept überdenken und mir überlegen, ob Du hier nicht auf einen Synchronisationsmechanismus zwischen Deinen Threads zurückgreifst.

HTH Phil

Geschrieben
Ich würde am hier einmal Dein Konzept überdenken und mir überlegen, ob Du hier nicht auf einen Synchronisationsmechanismus zwischen Deinen Threads zurückgreifst.

Nein Klotzkopp hat schon recht das das überhaupt nicht benötigt wird. Das wäre nur ein rumwerkelm an einer falschen Herangehensweise.

Geschrieben

Hallo Guybrush,

Du hast recht. Ich dachte dass man mit Hilfe der Synchronisation eben in einem Neukonzept den Slave- bzw Masterthread die Kommunikation sicherstellt. Die Prüfung, ob Master oder Slave muss natürlich als Preprocessing statt finden. Ich hatte das Problem, dass aus dem Preprocessing ein Masterthread erzeugt wurde, der wieder verschiedene Informationen bekommen hat und daraus dann mehrere Slaves erzeugt wurden. Die Slaves konnten zwar unabhängig arbeiten, mussten aber in einer definierten Reihenfolge beendet werden, so dass ich falls ein Slavethread früher fertig war, diesen schlafen legen musste.

Gruß

Phil

Geschrieben

Danke euch allen,

ich hab jetzt so, wie Klotzkopp gesagt hat, gemacht. :D

Bei starten des Programms wird die abfrage als Thread gestartet, aber später aus dem Slavethread als normale Funktion, es klappt wunderbar.

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...