假设我有一个由100个元素以及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完成所有元素处理之后才能运行。
发布于 2020-06-16 10:14:27
由于希望在调用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);以上都是未经测试的,但希望能让您对所需内容有一些了解。
https://stackoverflow.com/questions/62402305
复制相似问题