kathi008 Geschrieben 10. Oktober 2007 Teilen Geschrieben 10. Oktober 2007 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 10. Oktober 2007 Teilen Geschrieben 10. Oktober 2007 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
kathi008 Geschrieben 10. Oktober 2007 Autor Teilen Geschrieben 10. Oktober 2007 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! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 10. Oktober 2007 Teilen Geschrieben 10. Oktober 2007 Du musst die Abfragefunktion natürlich aus dem SlaveThread heraus aufrufen. Das sollte den Rest des Programms nicht beeinflussen. Zumindest nicht, wenn nicht noch ein Bug drin ist. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
flashpixx Geschrieben 10. Oktober 2007 Teilen Geschrieben 10. Oktober 2007 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Guybrush Threepwood Geschrieben 10. Oktober 2007 Teilen Geschrieben 10. Oktober 2007 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
flashpixx Geschrieben 10. Oktober 2007 Teilen Geschrieben 10. Oktober 2007 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Guybrush Threepwood Geschrieben 10. Oktober 2007 Teilen Geschrieben 10. Oktober 2007 Ah dann hab ich dich falsch verstanden Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
flashpixx Geschrieben 10. Oktober 2007 Teilen Geschrieben 10. Oktober 2007 Dafür sind wir doch alle hier, um eine gute fachliche Diskussion zu führen. Denn nur so kann man anderen sinnvoll helfen Lieben Gruß Phil Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
kathi008 Geschrieben 12. Oktober 2007 Autor Teilen Geschrieben 12. Oktober 2007 Danke euch allen, ich hab jetzt so, wie Klotzkopp gesagt hat, gemacht. Bei starten des Programms wird die abfrage als Thread gestartet, aber später aus dem Slavethread als normale Funktion, es klappt wunderbar. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
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.