Konzeptfrage zu Endlosschleife und Queue
Verfasst: Sonntag 10. Dezember 2023, 20:01
Hallo,
für ein kleines Radioprojekt (RPi Zero W2 mit 240x240 Display) benötige ich einerseits eine Laufschrift und andererseits die Möglichkeit auf die Eingabe einer Fernbedienung zu reagieren.
Ich habe für jeden dieser Bereiche sehr gut funktionierenden Code gefunden.
Für die Laufschrift:
Für die Oberfläche wird PIL benutzt.
Für die Eingaben würde ich gerne Queues benutzen, um "in Ruhe" auf die Ereignisse reagieren zu können.
Auch dieser Teil funktioniert gut.
Mein Problem ist nun, wie ich diese Teile zusammen bekomme. Ich hatte hierzu schon eine nicht stabile C++ Lösung mit Timern, bei der ich die Ursache der Instabilität nicht herausfinden konnte.
Ich hoffe nun auf diesem Weg erfolgreicher zu sein.
Viele Grüße
für ein kleines Radioprojekt (RPi Zero W2 mit 240x240 Display) benötige ich einerseits eine Laufschrift und andererseits die Möglichkeit auf die Eingabe einer Fernbedienung zu reagieren.
Ich habe für jeden dieser Bereiche sehr gut funktionierenden Code gefunden.
Für die Laufschrift:
Code: Alles auswählen
size_x= img_draw.textlength(MESSAGE, font)
text_x = 240
text_y = 15
t_start = time.time()
while True:
x = (time.time() - t_start) * 25
x %= (size_x + disp.width)
draw.rectangle((0, 0, 240, 60), (226, 226, 226)) #draw ist
draw.text((int(text_x - x), text_y), MESSAGE, font=font, fill=(0, 0, 0))
time.sleep(0.1)
img_bg.paste(img_scroll,(0,179))
disp.display(img_bg)
Für die Eingaben würde ich gerne Queues benutzen, um "in Ruhe" auf die Ereignisse reagieren zu können.
Code: Alles auswählen
def send_key(queue, thread_event):
while not thread_event.is_set():
for key, mask in selector.select():
device = key.fileobj
for event in device.read():
if event.type == 1:
if event.value == 0:
rf_key = event.code
queue.put(rf_key)
def get_key(queue, thread_event):
while not thread_event.is_set() or not queue.empty():
rf_key = queue.get()
match rf_key:
case 115: # Volume up
.
.
.
if __name__ == "__main__":
pipeline = queue.Queue(maxsize=10)
thread_event = threading.Event()
with concurrent.futures.ThreadPoolExecutor(max_workers=2) as executor:
executor.submit(send_key, pipeline, thread_event)
executor.submit(get_key, pipeline, thread_event)
Mein Problem ist nun, wie ich diese Teile zusammen bekomme. Ich hatte hierzu schon eine nicht stabile C++ Lösung mit Timern, bei der ich die Ursache der Instabilität nicht herausfinden konnte.
Ich hoffe nun auf diesem Weg erfolgreicher zu sein.
Viele Grüße