Hallo zusammen
Ich habe ein Programm das eine Funktion hat, die etwas an ein Gerät an der seriellen Schnittstelle schickt, die Antwort abwartet und diese dann als Rückgabewert liefert. Das Problem ist, dass es durchaus eine Minute dauert kann, bis eine Antwort kommt. Ich könnte jetzt mit eine while-Schlaufe die ganze Zeit abfragen, ob schon eine Antwort gekommen ist, diese Lösung benötigt mit aber zu viel Rechenleistung.
Wenn ich z.B. mit PySerial ein read mache, dann wird ja der Programmablauf auch erst fortgeführt, wenn etwas empfangen wurde, bzw. das Timeout erreicht wurde. Genau so etwas will ich auch machen. Wie funktioniert das?
Programmablauf blockieren
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
evtl. mit time.sleep() arbeiten?
Das Problem ist, dass ich nicht weiss wie lange es geht, bis ich eine Antwort erhalte. Und während time.sleep() kann ich ja auch auf nichts reagieren. Ausser ich könnte von einem anderen Thread aus diesen wieder "aus dem Schlaf erwecken".
Was ich noch vegass; wenn etwas empfangen wurde, wird ein Event ausgelöst. Vielleicht kann man damit etwas anfangen.
Was ich noch vegass; wenn etwas empfangen wurde, wird ein Event ausgelöst. Vielleicht kann man damit etwas anfangen.
Darf ich von meinem Vorgesetzten aus nicht, da dass programmiertechnisch hässlich ist und das programm dadurch künstlich verlangsamt wird. Aber ich kann mir nicht vorstellen, dass das in pyserial so gelöst ist.
Hallo Gast,
wenn du nicht zeitlich basiert abfragen möchtest (was ja wirklich nicht viel CPU-Power braucht), dann musst du eben deine Funktion mit einem Interrupt verbinden. Voraussetzung dafür ist, dass dein Gerät am RS232 Interface dir auch wirklich was zurück schickt...
Tabellar
wenn du nicht zeitlich basiert abfragen möchtest (was ja wirklich nicht viel CPU-Power braucht), dann musst du eben deine Funktion mit einem Interrupt verbinden. Voraussetzung dafür ist, dass dein Gerät am RS232 Interface dir auch wirklich was zurück schickt...
Tabellar
Warum benutzt Du nicht einfach `PySerial`?Gast hat geschrieben:Wenn ich z.B. mit PySerial ein read mache, dann wird ja der Programmablauf auch erst fortgeführt, wenn etwas empfangen wurde, bzw. das Timeout erreicht wurde. Genau so etwas will ich auch machen.
Wenn du unter einem Unix arbeitest und auf die serielle Schnittstelle über das Dateisystem zugreifst, dann kannst du select nehmen.
Es geht nicht darum, dass ich auf einen Empfang von der seriellen Schnittstelle reagieren kann ohne zu Pollen, dieses Problem ist bereits gelöst. Es geht nur darum eine Funktion so lange nicht zu beenden, bis ein Event auftriff, durch was dieses Event ausgelöst wird, ist egal. Und zwar ist das nötig, da das Event den Rückgabewert der Funktion liefert. Das read habe ich nur als Beispiel verwendet was ich erreichen will. Trotzdem Danke für die vielen Tipps.
Habe jetzt selber eine Lösung gefunden. Falls es jemanden interessiert hier ist sie:
MyEvent.wait() läuft so lange, bis MyEvent.set() aufgerufen wird. Eigentlich ganz simpel nur schwer es herauszufinden. Nochmal Danke für eure Hilfe.
Code: Alles auswählen
def MyFunction(self):
self.MyEvent = threading.Event()
self.MyEvent.wait()
return
def OnEvent(self):
self.MyEvent.set()