使用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
的情况下执行此“回调”?是否可以使用函数指针?或者我的异步工作的整个概念是坏的吗?
我对线程等很陌生。在我看来,使用future
,promise
,{{1}}找到关于这个C ++ 11区域的好文章有点困难。 。课程。
答案 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
}
}