假设我有一个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处理完所有元素后才能运行。
由于你希望所有的调用都是 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);
以上是未经测试的,但希望能让你对所需的东西有所了解。
很遗憾,我无法从文档中找到答案,所以我测试了这段代码。
future = QtConcurrent::map(vector, Func1);
future = QtConcurrent::map(vector, Func2);
而结果是,对于矢量的某些元素,Func2比Func1先开始。另外,处理向量元素没有顺序,这在使用 QtConcurrent::map
.
为了解决我的问题,我移动了对象与槽,调用两个 QtConcurrent::map
到另一条线上,并使用 wait
我将失去一个线程在我的线程池。