Programmablauf blockieren

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Gast

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?
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

evtl. mit time.sleep() arbeiten?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Gast

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.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Was ist wenn du eine while-Schleife machst und darin ein time.sleep(0.1) oder so, damit nicht die Schleife die ganze CPU-Power für sich einnimmt?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Gast

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.
tabellar
User
Beiträge: 186
Registriert: Mittwoch 4. September 2002, 15:28

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
BlackJack

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.
Warum benutzt Du nicht einfach `PySerial`?
ProgChild
User
Beiträge: 210
Registriert: Samstag 9. April 2005, 10:58
Kontaktdaten:

Wenn du unter einem Unix arbeitest und auf die serielle Schnittstelle über das Dateisystem zugreifst, dann kannst du select nehmen.
Gast

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.
Gast

Habe jetzt selber eine Lösung gefunden. Falls es jemanden interessiert hier ist sie:

Code: Alles auswählen

def MyFunction(self):
    self.MyEvent = threading.Event()
    self.MyEvent.wait()
    return

def OnEvent(self):
    self.MyEvent.set()
MyEvent.wait() läuft so lange, bis MyEvent.set() aufgerufen wird. Eigentlich ganz simpel nur schwer es herauszufinden. Nochmal Danke für eure Hilfe.
Antworten