self._q_to_main = q_to_main
         self._bonus_iterator = bonus_iterator
         self._q_input: SimpleQueue[Event] = SimpleQueue()
-        Thread(target=self._loop, daemon=False).start()
+        self._thread = Thread(target=self._loop, daemon=False)
+        self._thread.start()
 
     def __enter__(self) -> Self:
         return self
 
     def __exit__(self, *_) -> Literal[False]:
         self._q_input.put(Event('QUIT'))
+        self._thread.join()
         return False  # re-raise any exception that above ignored
 
     def put(self, event: Event) -> None: