我有一个简单的任务调度:一个execute方法被调用,并packaged_task
返回一个指向我Task
。当任务完成后,我想显示调试数据(涉及GUI,因此我需要在主线程中执行此操作)。我想为此使用boost::wait_for_any
,但j->get()
有时会抛出异常boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::promise_already_satisfied> >
。这让我有两个想法。无论是由于复制,其异常类指示,但我不会看到这个occures,或由于get
被已经调用,这不能发生,因为期货是只在这个方法块可见的,我已经他们转化为shared_futrues所以它应该工作。正确使用升压:: wait_for_any
那么在wait_for_any
部分,我将如何取回指向已完成的Task
实例的指针?使用future
而不是shared_future
。
原来我的任务之一execute
函数中抛出了异常,期货将把这些异常带到get
调用中。代码本身很好(除了缺少的异常处理程序)。然而使用升压信号(见下面的答案)可能是更好的方法。
std::vector<boost::future<Task*>> futures;
std::vector<Task*> tasks = get_tasks();
for (Task* t : tasks) {
typedef boost::packaged_task<Task*()> task_t;
task_t task([t]() -> Task* {
t->execute();
return t;
});
auto fut = task.get_future();
futures.push_back(std::move(fut));
impl->io_service.post(boost::bind(&task_t::operator(), boost::make_shared<task_t>(std::move(task))));
}
for (Task* t : tasks) {
auto j = boost::wait_for_any(futures.begin(), futures.end());
Task* task = j->get();
task->display_debug();
futures.erase(j);
}
如果你有兴趣,这里是使用Boost信号类似的演示:** [住在Coliru(http://coliru.stacked-crooked.com/ a/f155fdcc19f25400)** – sehe 2014-10-30 08:57:04
原来我的任务之一的'execute'函数抛出了异常,期货将这些异常带到'get'调用。代码本身很好(除了缺少的异常处理程序)。然而使用升压信号可能是更好的方法。 – Mene 2014-10-30 13:33:05