Infrarotfernbedienung ohne warten abfragen

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • 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

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

    Einmal editiert, zuletzt von MistyFlower59469 (8. Januar 2021 um 18:39)

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

    “Dawn, n.: The time when men of reason go to bed.” — Ambrose Bierce, “The Devil's Dictionary”

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!