从使用异步启动的方法回调的最优雅方式
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
对象的指针,该对象存储模拟的输入和输出。 DataManager
和 Simulation
被创建为 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 领域的好文章 thread
、future
、promise
.. .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
}
}
使用 async
启动函数时实现非静态回调的最优雅方法是什么?
问题:我想要 ui 在计算完成后显示数据而不阻塞 ui。请不要考虑使用 ui 库中可能存在的某些 ui 事件循环,因为我正在寻找使用纯 C++ (11) 的更通用和优雅的解决方案。
我有一个处理用户界面的 MainWindow
class 和一个在非静态 run(SimulationSettings settings)
中进行一些复杂计算的 Simulation
class方法。 run
方法传递的 settings
结构的一部分是指向 DataManager
对象的指针,该对象存储模拟的输入和输出。 DataManager
和 Simulation
被创建为 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 领域的好文章 thread
、future
、promise
.. .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
}
}