这是有关通用c++事件驱动的应用程序设计的问题。
假设我们有两个线程,一个“Dispatcher”(或“Engine” ...)和一个“Listener”(或“Client” ...)。
假设我编写了Dispatcher代码,并将其作为库发布。当然,我也编写了Listener接口(interface)。
当分派(dispatch)器执行时(在侦听器注册之后)
listenerInstance.onSomeEvent();
事件处理代码实际上将由Dispatcher线程执行,因此,如果实现侦听器的人写了类似
void Listener::onSomeEvent() { while(true) ; }
调度员将永远卡住。

有没有一种“普通的旧c++”(我的意思是没有boost或libsigc++)的方法来“分离”这两个类,所以我可以确定我的Dispatcher可以正常工作,无论侦听器在回调中做什么?

再见,谢谢,
安德里亚

最佳答案

好吧,如果该事件在同一线程中被调用(据我所知可能是必要的),那么您对此无能为力。

如果这是在带有消息泵的Win32应用程序下,则可以注册Windows消息并使用表示此事件的数据调用PostMessage,还可以修补消息循环以解释该消息并调用该事件。您获得的是各种解耦,事件调用是异步的(即无论如何都将返回事件调用)。但是稍后,当您处理消息并实际调用事件时,您的主线程仍然会停滞,并且在事件处理程序准备就绪之前,其他任何线程都不会运行。

另一种选择是为您的调用创建一个新线程(或使用线程池)。这对于需要特定线程(即ui更新线程)的事件不起作用。另外,这会增加同步开销和线程生成开销,并且您可能会饿死线程系统和/或cpu时间。

但是,实际上,我认为预见并避免这些问题并不是您作为图书馆设计师的职责。如果最终用户想要创建一个长事件处理程序,请让他自己产生一个新线程。如果他没有,只希望他的特定线程处理事件,就让他。它简化了您的工作,并且不会增加任何不必要的开销。

关于c++ - 避免卡住回调,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2401046/

10-12 17:29