This commit is contained in:
jxxghp
2024-09-09 08:55:10 +08:00
parent 81ce44ee4d
commit b1d2125e22
2 changed files with 35 additions and 6 deletions

View File

@@ -187,17 +187,20 @@ class Command(metaclass=Singleton):
event, handlers = self.eventmanager.get_event()
if event:
logger.info(f"处理事件:{event.event_type} - {handlers}")
if not handlers and event.event_callback:
event.event_callback()
for handler in handlers:
names = handler.__qualname__.split(".")
[class_name, method_name] = names
try:
if class_name in self.pluginmanager.get_plugin_ids():
# 插件事件
self.threader.submit(
result = self.threader.submit(
self.pluginmanager.run_plugin_method,
class_name, method_name, copy.deepcopy(event)
)
if event.event_callback:
event.event_callback(result)
else:
# 检查全局变量中是否存在
if class_name not in globals():
@@ -210,7 +213,6 @@ class Command(metaclass=Singleton):
except Exception as e:
logger.error(f"事件处理出错:{str(e)} - {traceback.format_exc()}")
continue
else:
# 通过类名创建类实例
class_obj = globals()[class_name]()

View File

@@ -1,3 +1,5 @@
import threading
import typing
from queue import Queue, Empty
from typing import Dict, Any
@@ -76,17 +78,40 @@ class EventManager(metaclass=Singleton):
self._disabled_handlers.remove(class_name)
logger.debug(f"Event Enabled{class_name}")
def send_event(self, etype: EventType, data: dict = None):
def send_event(self, etype: EventType, data: dict = None, callback: typing.Callable = None):
"""
发送事件
发送事件(异步响应)
"""
if etype not in EventType:
return
event = Event(etype.value)
event.event_data = data or {}
logger.debug(f"发送事件:{etype.value} - {event.event_data}")
event.event_callback = callback
logger.debug(f"发送事件:{etype.value} - data{event.event_data}callback{callback}")
self._eventQueue.put(event)
def send_event_sync(self, etype: EventType, data: dict = None):
"""
发送事件(同步响应)
"""
result: any = None
condition = threading.Condition()
def callback(res):
nonlocal result
if res:
result = res.result()
with condition:
condition.notify_all()
thread = threading.Thread(target=self.send_event, args=(etype, data, callback))
thread.start()
with condition:
condition.wait()
return result
def register(self, etype: [EventType, list]):
"""
事件注册
@@ -117,6 +142,8 @@ class Event(object):
self.event_type = event_type
# 字典用于保存具体的事件数据
self.event_data = {}
# 事件完成后回调函数
self.event_callback = None
# 实例引用,用于注册事件