]> Repositories - hackapet/Adafruit_Blinka_Displayio.git/commitdiff
Merge pull request #156 from janvolck/main
authorMelissa LeBlanc-Williams <melissa@adafruit.com>
Fri, 13 Jun 2025 16:41:19 +0000 (09:41 -0700)
committerGitHub <noreply@github.com>
Fri, 13 Jun 2025 16:41:19 +0000 (09:41 -0700)
relax displayio._background thread

displayio/__init__.py

index 9e9d97741db91c70320b3e397067f503347aaee3..e42d24a60d48c00019de9cd474d0a8f458497f96 100644 (file)
@@ -17,6 +17,7 @@ displayio for Blinka
 
 """
 import threading
+import time
 from typing import Union
 
 from ._bitmap import Bitmap
@@ -37,12 +38,16 @@ displays = []
 display_buses = []
 
 
-def _background():
+def _background(stop_event):
     """Main thread function to loop through all displays and update them"""
-    while True:
+    while not stop_event.is_set():
         for display in displays:
             display._background()  # pylint: disable=protected-access
 
+        # relax system when _background does nothing
+        # and we are in a while True loop consuming lots of CPU
+        time.sleep(0.0)
+
 
 def release_displays() -> None:
     """Releases any actively used displays so their busses and pins can be used again.
@@ -77,7 +82,10 @@ def allocate_display_bus(new_display_bus: "busdisplay._displaybus._DisplayBus")
     display_buses.append(new_display_bus)
 
 
-background_thread = threading.Thread(target=_background, daemon=True)
+background_thread_stop_event = threading.Event()
+background_thread = threading.Thread(
+    target=_background, args=(background_thread_stop_event,), daemon=True
+)
 
 
 # Start the background thread
@@ -88,6 +96,7 @@ def _start_background():
 
 def _stop_background():
     if background_thread.is_alive():
+        background_thread_stop_event.set()
         # Stop the thread
         background_thread.join()