gpt4 book ai didi

c++ - 我怎么能通过 boost 来制作像 QFutureWatcher 这样的东西

转载 作者:太空宇宙 更新时间:2023-11-04 13:49:25 29 4
gpt4 key购买 nike

我想在后台执行一些繁重的任务而不在等待返回值时阻塞gui,使用QFutureWatcher,事情很简单

来自Qt5.3文档的例子

// Instantiate the objects and connect to the finished signal.
MyClass myObject;
QFutureWatcher<int> watcher;
connect(&watcher, SIGNAL(finished()), &myObject, SLOT(handleFinished()));

// Start the computation.
QFuture<int> future = QtConcurrent::run(...);
watcher.setFuture(future);

如何在 boost 的帮助下生成类似于 QFutureWatcher 的“完成”信号(我需要在主线程中执行 handleFinished())?

虽然 QFutureWatcher 在那里并且正在运行,但我们的项目现在依赖于 Qt3、Qt4 和 Qt5(将应用程序从 Qt3、Qt4 升级到 Qt5 的优先级很低),这就是我们要实现后端的原因boost 和标准库的任务

编辑 1:刚找到答案,boost::future 为这种场景提供了一个非常优雅的解决方案,只需使用 future.then

future.then([](boost::future<int> f) { return print_value(f.get()); });

编辑 2:future调用的函数不在主线程执行,怎么让它在主线程执行呢?

最佳答案

如果你想让处理函数在主线程中运行,它必须在事件循环中。

在那种情况下你可以这样做:

(我使用 C++11 但可以使用 boost::threadQThread 轻松完成)

struct Object:public QObject {


Q_OBJECT
std::thread thr;

Object(QObject *parent):QObject(parent){}
~Object(){
if(thr.joinable())
thr.join();
}
public slots:
void handler(int);

};

...
auto obj = new Object(parent); //store it somewhere
obj->thr=std::thread([](Object * obj){
int ret=run_something();
//PostEvent on the event queue where the obj Object resides
QMetaObject::invokeMethod(obj, "handler",
Qt::QueuedConnection,
Q_ARG(int,ret));
}
...

关于c++ - 我怎么能通过 boost 来制作像 QFutureWatcher 这样的东西,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24114678/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com