5

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

aaaand 它可以工作,100% 的 CPU 使用率和大约 25-30% 的速度。但它会产生大约 65 个新线程(不管它处理 25 或 250 个视频),并且这些线程中的大多数在处理阶段后都不会消失。

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

只需查看活动监视器即可完成所有观察。

提前致谢。

4

1 回答 1

6

如果您阅读此线程,QtConcurrent 的未来似乎是不确定的。

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

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

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

使用 QThread 实际上很容易做到,因为 QThread 不是直接的线程,而是线程控制器。您可以在此处阅读有关如何“真正使用 QThreads”的信息。

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

于 2013-11-14T08:59:04.630 回答