gpt4 book ai didi

c++ - 使用 QtConcurrent 在 QT 中实现多线程

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:24:58 25 4
gpt4 key购买 nike

我正在用 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);
}

aaa 并且它工作正常,100% 的 CPU 使用率和大约 25-30% 的速度。但它会产生大约 65 个新线程(无论它处理 25 还是 250 个视频),并且这些线程中的大多数在处理阶段后不会消失。

我的问题是:这种方法对吗?是不是太生了?我应该“手动”控制线程创建吗? QtConcurrent 模块是否负责所有工作,所以我不应该关心线程管理? 85 个线程太多了吗?我应该在流程阶段之后尝试杀死其中一些吗??

每项观察都是通过查看事件监视器完成的。

提前致谢。

最佳答案

如果您阅读 this thread,QtConcurrent 的 future 似乎不确定.

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

在内核和线程数量相同的情况下,线程可以在内核之间拆分。

一旦您拥有的内核多于线程,您就会回到内核在需要处理的线程之间来回跳跃的原始方法。

使用QThread其实很容易,因为QThread不直接是一个线程,而是一个线程 Controller 。您可以阅读有关如何 'really truly use QThreads' here. 的信息

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

关于c++ - 使用 QtConcurrent 在 QT 中实现多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19973186/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com