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个线程太多了吗?我是否应该尝试在流程阶段后杀死其中一些?
只需查看活动监视器即可完成每个观察.
提前致谢.
如果你读这个帖子,QtConcurrent的未来似乎不确定.
拥有更多处理内核的线程有点多余.如果你有一个核心和2个线程在运行,处理器会花费时间在处理2个线程之间切换,但会给用户同时处理的外观.
使用相同数量的核心和线程,可以在核心之间拆分线程.
一旦你有多个核心而不是线程,你就会回到原来的核心方法,在需要处理的线程之间跳起来回来.
使用QThread实际上非常容易,因为QThread不是直接的线程,而是线程控制器.你可以在这里阅读有关如何"真正真正使用QThreads"的内容.
如上所述,您创建继承到QObject的对象并将其移动到QThread.很少提到的是,如果需要,您可以将多个对象移动到新的QThread.