gpt4 book ai didi

c++ - QFutureWatcher 如何观察多个任务/ future 和 finished() 信号

转载 作者:太空狗 更新时间:2023-10-29 20:54:42 30 4
gpt4 key购买 nike

我有一些任务,从 QtConcurrent::run() 开始。任务有 QFutureWatcher。我知道 QFutureWatcher 可以监视 only Future,但是当我从 UI 开始相同的任务时,如何在每个任务上创建 `QFutureWatcher*?是吗:

QFutureWatcher<void> *watcher = new QFutureWatcher;
watcher->setFuture(future);
QVector<QFutureWatcher<void>*> watchers;
watchers.push_back(watcher); // vector with pointers to each tasks watchers

还是别的?* 我的麻烦 是我从我的代码开始每个任务,但任务是用外部 DLL 函数执行的。而且我没有 API 来停止任务。在收到完成的 QFutureWatcher 信号后,我只能等待任务结束并关闭任务并释放所有相关数据。

此刻,我使用了两个 QFutureWatchers - 一个正在监视第一个运行的任务,另一个 - 如果第一个任务没有结束则启动并使用临时观察器和临时槽(代码同样,我创建它只是为了接收另一个带有相关数据的观察者信号)直到第一个任务结束。它观察相同的代码,但我必须复制它等待第一个任务结束,因为 QFutureWatcher 没有包含完成信号和相关 watcher.result()`s 的队列..

1) Qt有没有队列任务机制?或者我怎样才能捕捉到多个任务的 future ?

2) QtConcurrent::run 没有 cancel() 槽。我可以对一个序列项使用映射/映射函数吗?映射的 API 是否已排队处理任务/完成信号?我怎么能意识到这一点?谢谢!

最佳答案

1) 你可以使用这样的东西(只是代码草稿):

class MultiWatcher
: public QThread
{
Q_OBJECT

signals:
void allDone();

public:
void run() override;
QFutureSynchronizer _sync;
};

void MultiWatcher::run()
{
_sync.waitForFinished();
emit allDone();
}


class Test
: public QObject
{
Q_OBJECT
public:
//...
void do();
void onDone();
};

void Test::do()
{
// fill some futures
auto w = new MultiWatcher();
w->_sync.addFuture( f1 ); // Not thread-safe
w->_sync.addFuture( f2 );
w->_sync.addFuture( f3 );
// ...
connect( w, &MultiWatcher::allDone, this, &Test::onDone );
w->start();
}

void Test::onDone()
{
sender()->deleteLater();
qDebug() << "All futures are done";
}

//...
test->do();

2) 有 QFuture::cancel() mapped calculations的方法。从你的问题看不清楚,futures是怎么得到的,所以不好多说。您可能会阅读 concurrency in Qt并问更多问题,如果你有的话。

QFuture::cancel 无法与QtConcurrent::run 一起使用,您需要在线程代码中设计另一种中断机制。例如:

std::atomic_bool _isRunning = true; // somewhere in code

void MyWorker::doWork()
{
while (_isRunning)
{
// Do next step of computation
}
}

// Use _isRunning = false; to interrupt. It's thread-safe.

但是中断您不管理的代码(来自外部 .dll)是有风险的,因为您可能有很多泄漏。这就是 QtConcurrent 中没有“终止”API 的原因。

P.S. 请不要写那个 I'm do it wrong with QThread .什么都好。我知道我在做什么。这是一个很好的示例,QThread 的继承是可以的。

关于c++ - QFutureWatcher 如何观察多个任务/ future 和 finished() 信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38345474/

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