Infrarotfernbedienung ohne warten abfragen

  • Hallo,


    ich baue ein Internetradio, das einige Tasten besitzt, mit denen ich Programme wählen, Lautstärke ändern, usw. kann. Das funktioniert auch schon. Ich frage die Tasten über GPIO-Pins ab. Parallel verwende ich eine Infrarotfernbedienung für ähnliche oder die gleichen Funktionen. Die funktioniert auch. Ich verwende das lirc modul.


    Wenn ich nun alle Abfragen in einem Programm nacheinander ablaufen lasse blockieren sie sich gegenseitig.


    Wenn ich für die Fernbedienung eine Taste mit


    taste = (connection.readline())


    einlese, wartet das Programm auf einen Tastendruck und führt dann den restlichen Code zur Abfrage der anderen Tasten natürlich nicht aus.

    Auch wenn ich die Abfrage der Fernbedienung in einen eigenen Thread auslagere ergibt sich dasselbe Verhalten.


    Ich möchte also, dass die Fernbedienung regelmäßig abgefragt wird, (um im Falle eines Tastendrucks reagieren zu können), ohne auf einen Tastendruck zu warten und gleichzeitig das andere Programm abläuft, also auf Tasten reagieren kann. Ich hoffe, ich habe mich verständlich ausgedrückt.


    Da ich noch ein Python-Neuling bin, scheitere ich hier völlig.


    Geht so etwas überhaupt?


    Für jeden Hinweis wäre ich dankbar

  • behoj096 So etwas löst man beispielsweise über eine zentrale Queue (Modul `queue`) für Ereignisse in die die verschiedenen Abfragen ihre Ereignisse stecken. Blockierende Abfragen laufen dabei in einem eigenen Thread.

    “Es ist schon über so viele Dinge Gras gewachsen, dass man bald keiner Wiese mehr trauen kann.”

  • ich hab mal versucht mich einzulesen.


    Für einen Python-Neuling ist das aber - vorsichtig gesagt - nicht einfach.


    Gibt es irgendwo ein Beispiel, wo man sich das mal anschauen kann?

  • Ich bin auf fork aufmerksam geworden.


    Threads werden ja scheinbar nacheinander abgearbeitet, wenn also in einem Thread auf eine Eingabe gewertet wird, wartet das ganze Programm.


    Wie ist das bei fork???

  • Das stimmt nicht. Ein thread der wartet sorgt dafür, dass alle anderen laufen. Und readline wartet. Womit andere dran kommen. Selbst wenn das immer nur einer ist, somit das Programm ales ganzes weiter.


    fork hilft dir nicht.

    Edited once, last by MistyFlower59469 ().

  • Auch so ganz grundsätzlich, wenn keiner der Threads in einer blockierenden E/A-Operation wartet, werden die nicht sequentiell nacheinander abgearbeitet. In CPython kann mit dem „global interpreter lock“ immer nur ein Thread zur Zeit Python-Bytecode abarbeiten, aber das macht der nicht endlos lange sondern immer nur eine bestimmte Zeit/Anzahl von Bytecodes, bevor er das Lock wieder freigibt und auch andere Threads Bytecode ausführen können. Das heisst effektiv werden die Threads auch bei reinem Bytecode nebenläufig ausgeführt. Bei Code der die meiste Zeit damit verbringt auf Benutzereingaben zu warten, ist das auch überhaupt kein Problem. Das wird nur blöd wenn man echte Parallelität bei rechenlastigen Aufgaben braucht.


    Und selbst wenn man Parallelität braucht, würde man eher nicht mehr selbst auf so einer ”primitiven” Ebene mit `fork()` arbeiten, sondern beispielsweise mit `concurrent.futures` oder dem `multiprocessing`-Modul. Beides in der Python-Standardbibliothek.

    “Es ist schon über so viele Dinge Gras gewachsen, dass man bald keiner Wiese mehr trauen kann.”

  • Danke für die Antworten. Das hilft mir schon weiter. Ich werde mich da mal einarbeiten und etwas experimentieren.