【发布时间】:2012-07-22 06:59:21
【问题描述】:
我试图弄清楚如何使用协程(在 Lua 中)处理事件。我看到一种常见的方法似乎是创建产生当前协程的包装函数,然后在您等待的事情发生时恢复它。这似乎是一个不错的解决方案,但是这些问题呢? :
如何同时等待多个事件,并根据先发生的事件进行分支?还是应该重新设计程序以避免这种情况?
如何取消等待一定时间?事件循环可以在其套接字发送/接收包装器中包含超时参数,但是自定义事件呢?
如何触发协程从外部改变其状态?例如,我想要一个在调用时会导致协程跳转到不同步骤或开始等待不同事件的函数。
编辑:
目前我有一个系统,我在其中注册一个带有事件的协程,并且每次事件发生时,协程都会以事件名称和信息作为参数恢复。使用这个系统,1 和 2 不是问题,3 可以通过让 coro 期望一个特殊的事件名称来解决,使其跳转到不同的步骤,并使用该名称作为 arg 恢复它。同样,自定义对象也可以具有注册事件处理程序的方法。
我只是想知道这是否被认为是使用协程进行事件处理的正确方法。例如,如果我有一个读取事件和一个计时器事件(作为读取的超时),并且读取事件首先发生,我必须手动取消计时器。它似乎不适合顺序性质或使用协程处理事件。
【问题讨论】:
-
“我只是想知道这是否被认为是使用协程进行事件处理的正确方法。”如果它对你有用,那么它就是正确的方法。为什么要使用计时器事件来超时另一个事件?简单地将超时内置到您的事件系统中不是更有意义吗?
-
“如果它适合你,那么它就是正确的方法”它可以正常工作(但不是很好),我在想可能有一种更好的方法,但我错过了这是因为我对协程不是非常熟悉。 “你为什么要使用计时器事件来超时另一个事件?”。我可以,但是自定义事件源都必须实现超时。也许我可以通过添加一个系统来向主事件循环注册自定义事件源来解决这个问题?最后,也许我应该在第一次触发时自动删除处理程序?