You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

52 lines
1.6 KiB

from threading import Event, Lock
from collections import defaultdict
from queue import Queue, Empty
import threading
class EventSystem:
def __init__(self):
self.listeners = defaultdict(list)
self.event_queue = Queue()
self.lock = Lock()
self._stop_event = Event()
self.event_thread = threading.Thread(target=self._process_events)
self.event_thread.start()
def add_listener(self, event_type, callback):
with self.lock:
self.listeners[event_type].append(callback)
def remove_listener(self, event_type, callback):
with self.lock:
self.listeners[event_type].remove(callback)
def emit(self, event_type, data=None):
self.event_queue.put((event_type, data))
def emit_sync(self, event_type, data=None):
#with self.lock:
for listener in self.listeners[event_type]:
listener(data)
def call_sync(self, event_type, data=None):
#with self.lock:
if event_type in self.listeners and self.listeners[event_type]:
# Call only the first registered listener
return self.listeners[event_type][0](data)
return None
def _process_events(self):
while not self._stop_event.is_set():
try:
event_type, data = self.event_queue.get(timeout=0.1)
with self.lock:
for listener in self.listeners[event_type]:
listener(data)
except Empty:
pass
def stop(self):
self._stop_event.set()
self.event_thread.join()
event_system = EventSystem()