mirror of
https://github.com/dcs-retribution/dcs-retribution.git
synced 2025-11-10 15:41:24 +00:00
46 lines
1.3 KiB
Python
46 lines
1.3 KiB
Python
from threading import Event, Thread, Timer
|
|
from typing import Callable
|
|
|
|
|
|
class SimUpdateThread(Thread):
|
|
def __init__(self, update_callback: Callable[[], None]) -> None:
|
|
super().__init__()
|
|
self.update_callback = update_callback
|
|
self.running = False
|
|
self.should_shutdown = False
|
|
self._interrupt = Event()
|
|
self._timer = self._make_timer()
|
|
|
|
def run(self) -> None:
|
|
while True:
|
|
self._interrupt.wait()
|
|
self._interrupt.clear()
|
|
if self.should_shutdown:
|
|
return
|
|
if self.running:
|
|
self.update_callback()
|
|
self._timer = self._make_timer()
|
|
self._timer.start()
|
|
|
|
def on_sim_pause(self) -> None:
|
|
self._timer.cancel()
|
|
self._timer = self._make_timer()
|
|
self.running = False
|
|
|
|
def on_sim_unpause(self) -> None:
|
|
if not self.running:
|
|
self.running = True
|
|
self._timer.start()
|
|
|
|
def stop(self) -> None:
|
|
self.should_shutdown = True
|
|
self._interrupt.set()
|
|
|
|
def on_timer_elapsed(self) -> None:
|
|
self._timer = self._make_timer()
|
|
self._timer.start()
|
|
self._interrupt.set()
|
|
|
|
def _make_timer(self) -> Timer:
|
|
return Timer(1 / 60, lambda: self._interrupt.set())
|