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

标签 c++ multithreading qt 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);
}

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/

相关文章:

c++ - 当模板有默认参数时省略尖括号

java - Spring 的线程

java - 当 Java 线程用于面向 Internet 的 Java Web 应用程序时

java - 线程可能无法启动吗?

qt - 为每个 Qt Kit 指定 boost 库

python - PyQt5 QOpenGLWidget空闲问题

qt - 编辑 QTableView 单元格时设置初始文本

c++ - 对象存在于 C++ 中意味着什么?

c++ - 使用模数运算符保持在容器的索引范围内

c++ - 如何在 C++ 中从文件定义数据类型?