将数据传递给来自不同线程的函数
Passing data to function from different thread
我的 C++ 11 应用程序中有 long-运行 函数,本质上是 sub_main
。我需要通知此函数有关 situation
在不同线程中出现的情况。要求:
situation
随时可以升
- 应用程序最多应在一个地方处理
situation
(它也可以不处理)
- 它确实不需要在执行时超快或不延迟
截至目前,我考虑了两个选项:
- 通过包含
situations
内部队列的 factoree 传递对象工厂。然后在 sub_main
内定期轮询对象以获取新的 situations
。轮询的对象从队列中删除。当应用程序决定不处理特定位置的情况时,它可以将其移回全局 situations
队列,下一个构造的 factoree 将获得 situation
(因此可以在 [=10= 中的其他地方处理) ])
- 类似情况,但不是轮询,而是使用 lambda 函数根据需要更新
sub_main
内的局部变量。此版本不使用连续轮询,但可读性较差
两者似乎都有点复杂,我想知道我是否错过了更简单的解决方案。问题是 sub_main
正在我的图书馆之外实施,我正在向最终用户提供我的 situations
我最终使用了@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
是轻量级对象,将在其析构函数中注销处理程序。
我的 C++ 11 应用程序中有 long-运行 函数,本质上是 sub_main
。我需要通知此函数有关 situation
在不同线程中出现的情况。要求:
situation
随时可以升- 应用程序最多应在一个地方处理
situation
(它也可以不处理) - 它确实不需要在执行时超快或不延迟
截至目前,我考虑了两个选项:
- 通过包含
situations
内部队列的 factoree 传递对象工厂。然后在sub_main
内定期轮询对象以获取新的situations
。轮询的对象从队列中删除。当应用程序决定不处理特定位置的情况时,它可以将其移回全局situations
队列,下一个构造的 factoree 将获得situation
(因此可以在 [=10= 中的其他地方处理) ]) - 类似情况,但不是轮询,而是使用 lambda 函数根据需要更新
sub_main
内的局部变量。此版本不使用连续轮询,但可读性较差
两者似乎都有点复杂,我想知道我是否错过了更简单的解决方案。问题是 sub_main
正在我的图书馆之外实施,我正在向最终用户提供我的 situations
我最终使用了@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
是轻量级对象,将在其析构函数中注销处理程序。