多个QtConcurrent::map的执行顺序。

问题描述 投票:0回答:2

假设我有一个100个元素的向量,还有Func1和Func2,在单线程版本中,Func1处理向量元素,当Func1完成后,Func2必须对元素开始不同的处理。在单线程版本中,Func1处理向量元素,当Func1完成后,Func2必须开始对元素进行不同的处理。QtConcurrent::map 按照以下顺序,Func1和Func2究竟会按照什么顺序执行?

QFuture<void> future;
future = QtConcurrent::map(vector, Func1);
future = QtConcurrent::map(vector, Func2);

我必须提到,使用 future.waitForFinished() 会阻塞我的应用程序主线程,这是我不希望看到的。

future = QtConcurrent::map(vector, Func1);
future.waitForFinished();
future = QtConcurrent::map(vector, Func2);

同时我也不想执行那些 QtConcurrent::map 在一个次要的线程中,并做 future.waitForFinished() 所以,问题是,我的线程池中的任务是否由 QtConcurrent::map 按顺序执行?

编辑

在单线程和多线程方法中,Func2必须在Func1处理完所有元素后才能运行。

multithreading qt dictionary threadpool qtconcurrent
2个回答
2
投票

由于你希望所有的调用都是 Func1 呼叫前完成 Func2 做出了,你就不能再打第二个电话到 QtConcurrent::map 在第一种情况下,已知已经完成。

然而,与其说是调用 future.waitForFinished() 你可以用 QFutureWatcher...

QFutureWatcher<void> watcher;
auto future = QtConcurrent::map(vector, Func1);
QObject::connect(&watcher, &QFutureWatcher::finished,
                 [&]()
                   {

                     /*
                      * All calls to Func1 have finished so it's
                      * safe to invoke Func2.
                      */
                     future = QtConcurrent::map(vector, Func2);
                   });
watcher.setFuture(future);

以上是未经测试的,但希望能让你对所需的东西有所了解。


0
投票

很遗憾,我无法从文档中找到答案,所以我测试了这段代码。

future = QtConcurrent::map(vector, Func1);
future = QtConcurrent::map(vector, Func2);

而结果是,对于矢量的某些元素,Func2比Func1先开始。另外,处理向量元素没有顺序,这在使用 QtConcurrent::map.

为了解决我的问题,我移动了对象与槽,调用两个 QtConcurrent::map 到另一条线上,并使用 wait 我将失去一个线程在我的线程池。

© www.soinside.com 2019 - 2024. All rights reserved.