使用QtConcurrent在QT中进行多线程处理

Som*_*ild 5 c++ qt multithreading qtconcurrent

我在Qt中开发一个应用程序,在某些时候处理一堆视频.它工作正常,但它在进程阶段只有40-60%的CPU使用率,所以我试图使它多线程.

我使用QtConcurrent导致他的"高水平"而不是更传统的线程管理,我的代码很简单:

for(int i = 0; i < totalVideos; i++)
{
    QFuture<ResultClass *> futureToken = QtConcurrent::run(this, process, listOfVideos.takeFirst());
    QFutureWatcher<ResultClass *>* fw = new QFutureWatcher<ResultClass *>();
    connect(fw, SIGNAL(finished()), this, SLOT(manageResult));
    fw->setFuture(futureToken);
}
Run Code Online (Sandbox Code Playgroud)

aaaand它的工作原理,100%的CPU使用率和大约25-30%的速度.但它产生了大约65个新线程(无论它处理25或250个视频),并且大多数线程在处理阶段后不会消失.

我的问题是:这种做法是对的吗?太粗糙了吗?我应该"手动"控制线程创建吗?QtConcurrent模块是否完全处理,所以我不应该关心线程管理?85个线程太多了吗?我是否应该尝试在流程阶段后杀死其中一些?

只需查看活动监视器即可完成每个观察.

提前致谢.

The*_*ght 6

如果你读这个帖子,QtConcurrent的未来似乎不确定.

拥有更多处理内核的线程有点多余.如果你有一个核心和2个线程在运行,处理器会花费时间在处理2个线程之间切换,但会给用户同时处理的外观.

使用相同数量的核心和线程,可以在核心之间拆分线程.

一旦你有多个核心而不是线程,你就会回到原来的核心方法,在需要处理的线程之间跳起来回来.

使用QThread实际上非常容易,因为QThread不是直接的线程,而是线程控制器.你可以在这里阅读有关如何"真正真正使用QThreads"的内容.

如上所述,您创建继承到QObject的对象并将其移动到QThread.很少提到的是,如果需要,您可以将多个对象移动到新的QThread.