and*_*mba 3 c++ callback event-handling
这是一个关于通用 C++ 事件驱动应用程序设计的问题。
假设我们有两个线程,一个“调度程序”(或“引擎”...)和一个“监听器”(或“客户端”...)。
假设我编写了调度程序代码,并将其作为库发布。当然,我还编写了监听器接口。
当Dispatcher执行时(监听器注册后)
listenerInstance.onSomeEvent();
事件处理代码实际上将由 Dispatcher 线程执行,因此如果实现 Listener 的人编写类似的内容
void Listener::onSomeEvent() { while(true) ; }
调度程序将永远卡住。
是否有一种“普通的旧c ++”(我的意思是没有boost或libsigc ++)方法来“解耦”这两个类,这样我就可以确定我的调度程序将正常工作,无论侦听器在回调中做什么?
再见,提前致谢,
安德里亚
好吧,如果事件在同一个线程中调用(据我所知可能是一个要求),那么您对此无能为力。
如果这是在带有消息泵的 Win32 应用程序下,您可以注册 Windows 消息并PostMessage使用表示此事件的数据进行调用,并且您可以修补消息循环以解释该消息并调用该事件。您获得的是某种解耦,事件调用是异步的(即事件调用无论如何都会返回)。但是稍后当您处理消息并实际调用事件时,您的主线程仍然会停止,并且在事件处理程序准备就绪之前不会运行其他任何内容。
另一种选择是为您的调用创建一个新线程(或使用线程池)。这对于需要特定线程(即 ui 更新线程)的事件不起作用。此外,这会增加同步开销和线程生成开销,并且您可能会导致系统线程和/或 CPU 时间不足。
但实际上,我认为作为库设计师,你的工作并不是预测和避免这些问题。如果最终用户想要创建一个长事件处理程序,请让他自己生成一个新线程。如果他不这样做并且只想让他的特定线程处理事件,那就让他来吧。它简化了您的工作,并且不会增加任何不需要的开销。
| 归档时间: |
|
| 查看次数: |
501 次 |
| 最近记录: |