从async启动的方法回调最优雅的方式

时间:2015-01-09 17:06:57

标签: c++ multithreading c++11 asynchronous

使用async启动函数时实现非静态回调的最优雅方法是什么?

问题:我想要一个ui在计算结束后显示数据而不阻塞ui。请不要考虑使用ui库中可能存在的一些ui事件循环,因为我正在寻找使用纯C ++(11)的更通用和更优雅的解决方案。

我有一个处理用户界面的MainWindow类和一个Simulation类,它在非静态run(SimulationSettings settings)方法中进行一些复杂的计算。使用settings - 方法传递的run结构的一部分是指向DataManager对象的指针,该对象存储模拟的输入和输出。 DataManager以及Simulation被创建为MainWindow的成员。我在MainWindow类的非静态方法中使用以下行开始模拟:

auto run_simulation = std::bind(&Simulation::run, m_simulation, settings);
std::async(run_simulation);

run(...)方法返回后,我希望我的MainWindow执行其方法processesResults(),该方法使用现在保存在DataManager中的数据进行一些后处理 - 但是当然,在模拟过程中不会阻塞MainWindow功能的其余部分。有没有办法在不给Simulation指向MainWindow对象的thread的情况下执行此“回调”?是否可以使用函数指针?或者我的异步工作的整个概念是坏的吗? 我对线程等很陌生。在我看来,使用futurepromise,{{1}}找到关于这个C ++ 11区域的好文章有点困难。 。课程。

2 个答案:

答案 0 :(得分:2)

如果您只想在模拟完成后执行某些操作,则可以使用以下lambda表达式:

auto run_simulation = [this, &settings]() {
    m_simulation.run(settings);
    processResults();
};
std::async(run_simulation);

答案 1 :(得分:0)

您可以使用future::wait_for了解模拟完成的时间

auto fut = std::async(run_similation);

while (true) {
    // Your main loop

    std::chrono::milliseconds span (1);
    if (fut.valid() && fut.wait_for(span) != std::future_status::timeout) {
        // simulation is finished
    }
}