我在C ++ 11应用程序中具有长时间运行的功能,基本上是sub_main
。我需要通知这个函数关于situation
在不同的线程中上升。要求:
situation
可以随时升起situation
(它可能会使其未处理)截至目前,我考虑了两个选项:
situations
内部队列的factoree传递对象工厂。然后,在sub_main
内定期轮询对象以获取新situations
。轮询对象从队列中删除。当应用程序决定它不会处理特定位置的情况时,它可以将其移回全局situations
队列,并且下一个构造的factoree将获得situation
(因此可以在{{1}中的其他位置处理它})sub_main
内的局部变量。此版本不使用连续轮询,但可读性较差两者似乎都有点复杂,我想知道我是否错过了一个更简单的解决方案。问题是sub_main
正在我的图书馆外实施,我正在为最终用户提供sub_main
答案 0 :(得分:1)
我最终使用了@PhilBrubaker和责任链的建议:
void sub_main(std::shared_ptr<situation_register> situation_register)
{
std::unique_ptr<handler_instance> instance =
situation_register->register(priority::main, [=](situation* s)
{
switch(s->get_type())
{
case situation::screensaver:
s->get<situation_screensaver>()->prevent();
s->mark_as_handled();
break;
}
});
}
在这种情况下,如果函数不明确表示situation
已被处理,它将被传递给下一个已注册的处理程序(它们根据priority
进行排序)。 handler_instance
是轻量级对象,它将在析构函数中取消注册处理程序。