从使用异步启动的方法回调的最优雅方式

Most elegant way of callback from method launched with async

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

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

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

的非静态方法中使用以下行开始模拟
auto run_simulation = std::bind(&Simulation::run, m_simulation, settings);
std::async(run_simulation);

run(...) 方法 returns 之后,我希望我的 MainWindow 执行其方法 processesResults(),该方法对现在保存在 DataManager - 但当然不会在模拟期间阻止 MainWindow 的其余功能。有没有办法做到 "callback" 而不给 Simulation 一个指向 MainWindow 对象的指针?函数指针有可能吗?还是我做异步工作的整个概念不好? 我对线程等很陌生,我认为很难找到关于这个 C++11 领域的好文章 threadfuturepromise .. .classes.

如果你只想在模拟完成后做一些事情,你可以使用以下 lambda 表达式:

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

您可以使用 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
    }
}