From f1321bdf1920561d275497759a3f03f3063527c3 Mon Sep 17 00:00:00 2001 From: WOLF Date: Thu, 5 Mar 2015 09:32:36 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B0=86=E4=BA=8B=E4=BB=B6=E9=A9=B1=E5=8A=A8?= =?UTF-8?q?=E5=BC=95=E6=93=8E=E7=9A=84=E5=8F=98=E9=87=8F=E6=94=B9=E4=B8=BA?= =?UTF-8?q?=E7=A7=81=E6=9C=89=EF=BC=8C=E5=90=8C=E6=97=B6=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?put=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vn.event/eventEngine.py | 70 ++++++++++++++++++++++++++--------------- 1 file changed, 44 insertions(+), 26 deletions(-) diff --git a/vn.event/eventEngine.py b/vn.event/eventEngine.py index 7d4766b9..2ceada00 100644 --- a/vn.event/eventEngine.py +++ b/vn.event/eventEngine.py @@ -15,6 +15,17 @@ from eventType import * class EventEngine: """ 事件驱动引擎 + + 事件驱动引擎中所有的变量都设置为了私有,这是为了防止不小心 + 从外部修改了这些变量的值或状态,导致bug。 + + 变量说明 + __queue:私有变量,事件队列 + __active:私有变量,事件引擎开关 + __thread:私有变量,事件处理线程 + __timer:私有变量,计时器 + __handlers:私有变量,事件处理函数字典 + 方法说明 __run: 私有方法,事件处理线程连续运行用 @@ -24,12 +35,13 @@ class EventEngine: stop:公共方法,停止引擎 register:公共方法,向引擎中注册监听函数 unregister:公共方法,向引擎中注销监听函数 + put:公共方法,向事件队列中存入新的事件 事件监听函数必须定义为输入参数仅为一个event对象,即: 函数 def func(event) - .... + ... 对象方法 def method(self, event) @@ -41,28 +53,28 @@ class EventEngine: def __init__(self): """初始化事件引擎""" # 事件队列 - self.queue = Queue() + self.__queue = Queue() # 事件引擎开关 - self.active = False + self.__active = False # 事件处理线程 - self.thread = Thread(target = self.__run) + self.__thread = Thread(target = self.__run) # 计时器,用于触发计时器事件 - self.timer = QTimer() - self.timer.timeout.connect(self.__onTimer) + self.__timer = QTimer() + self.__timer.timeout.connect(self.__onTimer) - # 这里的handlers是一个字典,用来保存对应的事件调用关系 + # 这里的__handlers是一个字典,用来保存对应的事件调用关系 # 其中每个键对应的值是一个列表,列表中保存了对该事件进行监听的函数功能 - self.handlers = {} + self.__handlers = {} #---------------------------------------------------------------------- def __run(self): """引擎运行""" - while self.active == True: + while self.__active == True: try: - event = self.queue.get(block = True, timeout = 1) # 获取事件的阻塞时间设为1秒 + event = self.__queue.get(block = True, timeout = 1) # 获取事件的阻塞时间设为1秒 self.__process(event) except Empty: pass @@ -71,11 +83,14 @@ class EventEngine: def __process(self, event): """处理事件""" # 检查是否存在对该事件进行监听的处理函数 - if event.type_ in self.handlers: + if event.type_ in self.__handlers: # 若存在,则按顺序将事件传递给处理函数执行 - for handler in self.handlers[event.type_]: - handler(event) - + [handler(event) for handler in self.__handlers[event.type_]] + + # 以上语句为Python列表解析方式的写法,对应的常规循环写法为: + #for handler in self.__handlers[event.type_]: + #handler(event) + #---------------------------------------------------------------------- def __onTimer(self): """向事件队列中存入计时器事件""" @@ -83,41 +98,41 @@ class EventEngine: event = Event(type_=EVENT_TIMER) # 向队列中存入计时器事件 - self.queue.put(event) + self.put(event) #---------------------------------------------------------------------- def start(self): """引擎启动""" # 将引擎设为启动 - self.active = True + self.__active = True # 启动事件处理线程 - self.thread.start() + self.__thread.start() # 启动计时器,计时器事件间隔默认设定为1秒 - self.timer.start(1000) + self.__timer.start(1000) #---------------------------------------------------------------------- def stop(self): """停止引擎""" # 将引擎设为停止 - self.active = False + self.__active = False # 停止计时器 - self.timer.stop() + self.__timer.stop() # 等待事件处理线程退出 - self.thread.join() + self.__thread.join() #---------------------------------------------------------------------- def register(self, type_, handler): """注册事件处理函数监听""" # 尝试获取该事件类型对应的处理函数列表,若无则创建 try: - handlerList = self.handlers[type_] + handlerList = self.__handlers[type_] except KeyError: handlerList = [] - self.handlers[type_] = handlerList + self.__handlers[type_] = handlerList # 若要注册的处理器不在该事件的处理器列表中,则注册该事件 if handler not in handlerList: @@ -139,8 +154,11 @@ class EventEngine: del self.handlers[type_] except KeyError: pass - - + + #---------------------------------------------------------------------- + def put(self, event): + """向事件队列中存入事件""" + self.__queue.put(event) ######################################################################## @@ -162,7 +180,7 @@ def test(): from PyQt4.QtCore import QCoreApplication def simpletest(event): - print str(datetime.now()) + print u'处理每秒触发的计时器事件:%s' % str(datetime.now()) app = QCoreApplication(sys.argv)