如何使用 generate_events 事件?
How do I use the generate_events event?
以下 python3 代码是我可能期望生成对 doit 事件的一些调用,然后是对终止事件的调用,这将停止应用程序,但只有第一个事件触发.我做错了什么?
from circuits import Component, Event, Debugger
import time
times = []
class doit(Event):
"""doit Event"""
class terminate(Event):
"""terminate Event"""
class App(Component):
def __init__(self):
super().__init__()
self.interval = .1
self.last = 0
self.count = 0
def doit(self, origin):
times.append(("%s from A at %.03f" % (origin, time.time())))
self.count += 1
self.last = time.time()
def generate_events(self, event):
if self.last + self.interval < time.time():
event.stop()
self.fire(doit('ge'))
if self.count >= 5:
event.stop()
self.fire(terminate())
def terminate(self):
self.stop()
(Debugger() + App()).run()
print("\n".join(times))
我使用 event.reduce_time_left(0) 而不是 event.stop() 得到了相同的行为。
示例中的主要错误是在无事可做时它不会reduce_time_left(time.time() - self.last + self.interval)
。
generate_events
在应用程序启动时触发一次。每个生成器都需要将 reduce_time_left()
设置为再次触发之前的最大合理时间 - 这样到那时它肯定会再次触发 - 无论是否生成某些东西。将时间减少到 0 表示此循环已完成(并且需要触发事件)。
首选解决方案使用 Timer
来实现时间功能,将此示例简化为显示其工作原理的逻辑。
from circuits import BaseComponent, Event, Timer, Debugger, handler
import time
class doit(Event):
"""doit Event"""
class App(BaseComponent):
timer = Timer(.1, doit('A'), persist=True)
def __init__(self):
super().__init__()
self.count = 0
@handler("doit")
def _doit(self, origin):
print("%s from A at %.03f" % (origin, time.time()))
self.count += 1
if self.count > 4:
self.stop()
(App() + Debugger()).run()
以下 python3 代码是我可能期望生成对 doit 事件的一些调用,然后是对终止事件的调用,这将停止应用程序,但只有第一个事件触发.我做错了什么?
from circuits import Component, Event, Debugger
import time
times = []
class doit(Event):
"""doit Event"""
class terminate(Event):
"""terminate Event"""
class App(Component):
def __init__(self):
super().__init__()
self.interval = .1
self.last = 0
self.count = 0
def doit(self, origin):
times.append(("%s from A at %.03f" % (origin, time.time())))
self.count += 1
self.last = time.time()
def generate_events(self, event):
if self.last + self.interval < time.time():
event.stop()
self.fire(doit('ge'))
if self.count >= 5:
event.stop()
self.fire(terminate())
def terminate(self):
self.stop()
(Debugger() + App()).run()
print("\n".join(times))
我使用 event.reduce_time_left(0) 而不是 event.stop() 得到了相同的行为。
示例中的主要错误是在无事可做时它不会reduce_time_left(time.time() - self.last + self.interval)
。
generate_events
在应用程序启动时触发一次。每个生成器都需要将 reduce_time_left()
设置为再次触发之前的最大合理时间 - 这样到那时它肯定会再次触发 - 无论是否生成某些东西。将时间减少到 0 表示此循环已完成(并且需要触发事件)。
首选解决方案使用 Timer
来实现时间功能,将此示例简化为显示其工作原理的逻辑。
from circuits import BaseComponent, Event, Timer, Debugger, handler
import time
class doit(Event):
"""doit Event"""
class App(BaseComponent):
timer = Timer(.1, doit('A'), persist=True)
def __init__(self):
super().__init__()
self.count = 0
@handler("doit")
def _doit(self, origin):
print("%s from A at %.03f" % (origin, time.time()))
self.count += 1
if self.count > 4:
self.stop()
(App() + Debugger()).run()