Seite 1 von 1

Programmablauf blockieren

Verfasst: Freitag 8. Juli 2005, 12:51
von 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?

Verfasst: Freitag 8. Juli 2005, 13:02
von jens
evtl. mit time.sleep() arbeiten?

Verfasst: Freitag 8. Juli 2005, 14:56
von 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.

Verfasst: Freitag 8. Juli 2005, 15:14
von jens
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?

Verfasst: Freitag 8. Juli 2005, 16:03
von 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.

Verfasst: Freitag 8. Juli 2005, 17:09
von tabellar
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

Re: Programmablauf blockieren

Verfasst: Samstag 9. Juli 2005, 00:20
von 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`?

Verfasst: Samstag 9. Juli 2005, 11:29
von ProgChild
Wenn du unter einem Unix arbeitest und auf die serielle Schnittstelle über das Dateisystem zugreifst, dann kannst du select nehmen.

Verfasst: Mittwoch 13. Juli 2005, 07:14
von 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.

Verfasst: Mittwoch 13. Juli 2005, 09:36
von 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.