common.py 811 B

12345678910111213141516171819202122232425262728293031323334353637383940
  1. from threading import Thread
  2. from queue import Queue
  3. import time
  4. class Input:
  5. _t = None
  6. _stop = False
  7. _q = Queue()
  8. interval = 1
  9. _read_cb = None
  10. def __init__(self, read_cb) -> None:
  11. self._read_cb = read_cb
  12. def start(self):
  13. if not self._t:
  14. self._stop = False
  15. self._t = Thread(target = self._main)
  16. self._t.setDaemon(True)
  17. self._t.start()
  18. def stop(self):
  19. if self._t:
  20. self._stop = True
  21. self._t.join()
  22. self._t = None
  23. def read(self):
  24. while not self._q.empty():
  25. yield self._q.get()
  26. def _main(self):
  27. while not self._stop:
  28. start_time = time.monotonic()
  29. self._read_cb()
  30. end_time = time.monotonic()
  31. remaining = self.interval + start_time - end_time
  32. if remaining > 0:
  33. time.sleep(remaining)