wait for renderer first

pull/35003/head
Cameron Clough 2 weeks ago
parent 442f791f8b
commit c958755377
  1. 33
      system/ui/lib/wrapper.py
  2. 4
      system/ui/spinner.py

@ -1,29 +1,29 @@
import threading import threading
import time import time
from typing import Generic, TypeVar from typing import Any
from openpilot.system.ui.lib.application import gui_app from openpilot.system.ui.lib.application import gui_app
class Renderer: class Wrapper:
def render(self): ... _renderer: Any
T = TypeVar("T", bound=Renderer) def __init__(self, title: str, renderer_cls, *renderer_args):
class Wrapper(Generic[T]):
def __init__(self, title: str, renderer_cls: type[T], *args):
self._title = title self._title = title
self._renderer_class = renderer_cls self._renderer_cls = renderer_cls
self._renderer_args = args self._renderer_args = renderer_args
self._renderer: T | None = None
self._stop_event = threading.Event() self._stop_event = threading.Event()
self._thread = threading.Thread(target=self._run, args=(self._stop_event,), daemon=True) self._thread = threading.Thread(target=self._run, daemon=True)
self._thread.start() self._thread.start()
def _run(self, stop_event: threading.Event): # wait for renderer to be initialized
while self._renderer is None and self._thread is not None and self._thread.is_alive():
time.sleep(0.01)
def _run(self):
gui_app.init_window(self._title) gui_app.init_window(self._title)
self._renderer = self._renderer_class(*self._renderer_args) self._renderer = self._renderer_cls(*self._renderer_args)
try: try:
for _ in gui_app.render(): for _ in gui_app.render():
if stop_event.is_set(): if self._stop_event.is_set():
break break
self._renderer.render() self._renderer.render()
finally: finally:
@ -32,11 +32,6 @@ class Wrapper(Generic[T]):
def __enter__(self): def __enter__(self):
return self return self
def wait(self):
"""wait for renderer to be initialized"""
while self._renderer is None and self._thread is not None and self._thread.is_alive():
time.sleep(0.01)
def close(self): def close(self):
if self._thread is not None and self._thread.is_alive(): if self._thread is not None and self._thread.is_alive():
self._stop_event.set() self._stop_event.set()

@ -73,9 +73,7 @@ class Spinner(Wrapper):
super().__init__("Spinner", Renderer) super().__init__("Spinner", Renderer)
def update(self, spinner_text: str): def update(self, spinner_text: str):
self.wait() self._renderer.set_text(spinner_text)
if self._renderer:
self._renderer.set_text(spinner_text)
def update_progress(self, cur: float, total: float): def update_progress(self, cur: float, total: float):
self.update(str(round(100 * cur / total))) self.update(str(round(100 * cur / total)))

Loading…
Cancel
Save