这是一个关于通用c++事件驱动应用程序设计的问题。
假设我们有两个线程,一个"Dispatcher“(或"Engine"...)和一个“监听器”(或“客户端”...)。
假设我编写了Dispatcher代码,并将其作为库发布。当然,我还编写了Listener接口。
调度程序执行时(在监听程序注册之后)
listenerInstance.onSomeEvent();
事件处理代码实际上将由Dispatcher线程执行,因此,如果实现侦听器的人员编写类似于
void Listener::onSomeEvent() { while(true) ; }
调度员将永远卡住。
有没有一种“普通的老式c++”(我指的是没有boost或libsigc++)的方法来“解耦”这两个类,这样我就可以确信,无论侦听器在回调中做什么,我的Dispatcher都会工作得很好?
再见了,提前谢谢你,
安德里亚
发布于 2010-03-08 20:07:38
好吧,如果事件是在同一个线程中被调用的(我似乎知道这是一个要求),那么你对此就无能为力了。
如果这是在带有消息泵的Win32应用程序下,您可以注册一条windows消息并使用表示此事件的数据调用PostMessage,然后您可以修补消息循环以解释该消息并调用事件。你得到的是一种类型的解耦,事件调用是异步的(即事件调用无论如何都会返回)。但稍后当您处理消息并实际调用事件时,您的主线程仍将停止,并且在事件处理程序准备就绪之前不会运行任何其他线程。
另一种选择是为您的调用创建一个新线程(或使用线程池)。这不适用于需要某个线程(即ui更新线程)的事件。此外,这会增加同步开销和线程衍生开销,并且您可能会使系统的线程和/或cpu时间匮乏。
但实际上,我不认为您作为库设计者的工作是预测和避免这些问题。如果最终用户想要创建一个长事件处理程序,就让他自己创建一个新线程。如果他不这样做,只是想让他的特定线程处理一个事件,那就让他来处理。它简化了您的工作,并且不会增加任何不必要的开销。
发布于 2010-03-08 20:05:11
恐怕没有原生的C++方法可以做到这一点。对于windows,您可以使用asynchronous procedure calls (APC)
发布于 2010-03-08 20:04:52
一种方法是将onSomeEvent调用到专用线程中。这不是100%的防弹,但它可以避免while(true);问题。
我希望它能帮上忙
https://stackoverflow.com/questions/2401046
复制相似问题