问题标签 [qtconcurrent]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
13 回答
21161 浏览

c++ - 如何减少程序的CPU使用率?

我编写了一个多线程程序,它通过大量浮点运算进行一些 CPU 繁重的计算。更具体地说,它是一个逐帧比较动画序列的程序。即,它将动画 A 中的帧数据与动画 B 中的所有帧进行比较,针对动画 A 中的所有帧。我对不同的动画并行执行这种密集操作,因此程序可以处理 AB 对、BC 对和 CA 对在平行下。该程序正在使用 QtConcurrent 和一个“映射”函数,该函数将一个带有运动的容器映射到一个函数上。QtConcurrent 为我管理线程池,我正在使用英特尔四核处理器,因此它产生 4 个线程。

现在,问题是我的进程破坏了我的 CPU。使用是 100% 不变的,如果我在足够大的动作集上运行我的程序(非分页区域中的页面错误),我实际上会出现蓝屏死机。我怀疑这是因为我的电脑超频了。但是,这可能是因为我编写程序的方式吗?我用来测试机器稳定性的一些非常密集的基准测试工具从未让我的电脑崩溃。有什么方法可以控制我的程序如何使用我的 CPU 来减少负载?还是我误解了我的问题?

0 投票
1 回答
3128 浏览

c++ - 使用 QFuture 更新 QProgressDialog

主 GUI 线程在等待 QFuture 时更新 QProgressDialog 的正确方法是什么。具体来说,这个循环中发生了什么:

现在我在那里有一个类似 sleep() 的调用,但这不是最佳的(当然会引入一些 GUI 延迟)。

如果我什么都不放,主线程将循环极点 pd.setValue(),浪费 CPU 周期。

我希望放置类似 QCoreApplication::processEvents(flags,maxtime) 的东西,但如果事件队列为空,它会立即返回。我想要一个等到 maxtime 或者即使队列为空的版本。这样,我得到了延迟,并且主线程始终准备好响应 GUI 事件。

0 投票
2 回答
791 浏览

c++ - Qt 中大量同时长时间运行的操作

我有一些长期运行的操作,数以百计。目前,他们每个人都在自己的线程上。我使用线程的主要目标不是加快这些操作。在这种情况下,更重要的是它们似乎同时运行。

我知道协作式多任务处理和光纤。但是,我试图避免任何需要在操作中接触代码的事情,例如在它们中添加yieldToScheduler(). 我也不想规定这些例程被程式化以被编码以发出一口大小的任务项队列......我想将它们视为黑匣子。

目前我可以忍受这些缺点:

  • 最大线程数往往为 O(1000)
  • 每个线程的成本是 O(1MB)

为了解决由于上下文切换导致的糟糕缓存性能,我确实有一个计时器的想法,它可以调整优先级,使得只有IdealThreadCount()线程处于正常优先级,所有其余线程都设置为空闲。这会让我扩大时间片,这意味着更少的上下文切换并且仍然可以满足我的目的。

问题1:这是个好主意吗?一个肯定的缺点是它不能在 Linux 上工作(文档说不QThread::setPriority()在那里)。

问题2:还有其他想法或方法吗?QtConcurrent 是否在考虑这种情况?

(一些相关阅读:how-many-threads-does-it-take-to-make-them-a-bad-choicemany-threads-or-as-few-threads-as-possiblemaximum-number-of -threads-per-process-in-linux )

0 投票
2 回答
23998 浏览

c++ - 是否可以将 QtConcurrent::run() 与类的函数成员一起使用

我似乎无法QtConcurrent::run()仅与一个简单的函数关联一个方法(类的函数成员)。我怎样才能做到这一点?

使用常规功能,我无法发出信号并且它很拖累。为什么有人会发现这是一个更好的替代方案,QThread这超出了我的范围,并且想要一些输入。

0 投票
1 回答
548 浏览

qt - 使用 qtconcurrent 生成异常并调用 QTime:currentTime

我似乎只使用使用 Qtconcurrent::run 创建的线程生成异常

我有一个名为 FPSengine 的类,它有一个名为 FPSengine::getData() 的方法,该方法由主线程和 3 个其他线程(2 个 QThreads 和 1 个使用 QtConcurrent::run())调用。在 FPSengine::getData() 内部,我调用 QTime::currentTime()。如果我从主线程或 QThreads 之一调用 FPSengine::getData() 我没有任何问题,但是当我从使用 Qtconcurrent::run() 创建的线程调用 FPSengine::getData() 时,有时会出现异常。Qtconcurrent 或 QTime:currentTime() 甚至 tzset (由 gdb 堆栈显示的 QTime::currentTime 调用)是否有问题?还是我的代码有问题。这是失败线程的堆栈信息:
0 raise /lib/libc.so.6 0
1 abort /lib/libc.so.6 0
2 ?? /lib/libc.so.6 0
3?? /lib/libc.so.6 0
4 免费 /lib/libc.so.6 0
5 ?? /lib/libc.so.6 0
6 tzset /lib/libc.so.6 0
7 QTime::currentTime() /usr/lib/libQtCore.so.4 0
8 FPSengine::xmitData FPSengine2.cpp 93
9 FPSengine: :getData FPSengine2.cpp 21
10 线程数据日志::运行线程数据日志.cpp 109
11 ?? /usr/lib/libQtCore.so.4 0
12 start_thread /lib/libpthread.so.0 0
13 克隆 /lib/libc.so.6 0 14 ?? 0

0 投票
1 回答
539 浏览

c++ - QFutureWatcher::progressValue 返回一个正整数,但最小值/最大值都为零

QFuture正在迭代一个双向迭代器,我认为这是问题的根源。但是,文档说QFutureWatcher::progressValue“返回和之间的值progressMinimumprogressMaximum。我这样打电话QtConcurrent::filteredQtConcurrent::filtered(myMap.begin(), myMap.end(), filterFn)

有谁知道出了什么问题?

0 投票
1 回答
293 浏览

qt - 用于 Symbian 的 QT 中的 QtConcurrent

我有一个关于在 Qt for Symbian 中支持 QtConcurrent 的问题。我使用 Qt 4.6.2,但我不明白如何使用 QtConcurrent。在相同版本的 QT 的 Wice 平台上一切正常,但在 Symbian 上不起作用。如何启用 QtConcurrent、QFuture、QFutureWatcher?

非常感谢您的回答!

0 投票
6 回答
2997 浏览

c++ - 在工作线程中创建的 QObject 的线程亲和性会发生什么,然后终止?

假设我调用QtConcurrent::run()which 在工作线程中运行一个函数,并在该函数中动态分配几个 QObject(供以后使用)。由于它们是在工作线程中创建的,因此它们的线程亲和性应该是工作线程的亲和性。但是,一旦工作线程终止,QObject 线程亲和性应该不再有效。

问题:Qt 会自动将 QObject 移动到父线程中,还是我们负责在工作线程终止之前将它们移动到有效线程中?

0 投票
5 回答
12266 浏览

multithreading - 可以取消并报告进度的 QFuture

该类QFuture具有诸如 , 等方法cancel()progressValue()这些显然可以通过QFutureWatcher. 但是,文档为QtConcurrent::run()

请注意,QtConcurrent::run() 返回的 QFuture 不支持取消、暂停或进度报告。返回的 QFuture 只能用于查询函数的运行/结束状态和返回值。

我徒劳地寻找什么方法实际上可以创建一个QFuture可以取消并报告单个长时间运行操作的进度。(看起来可能QtConcurrent::map()和类似的功能可以,但我只有一个单一的、长时间运行的方法。)

(对于那些熟悉 .Net 的人,类似于BackgroundWorker课程。)

有哪些可用选项?

0 投票
3 回答
2009 浏览

c++ - 使用 QtConcurrent 加载 Pixmap 并绘制它

我正在尝试创建一个 Tile 渲染程序。这是一些基本代码。

标题

共产党:

我正在尝试制作一个将大图像的图块粘贴到 QGraphicsScene 上的应用程序。但是一次加载所有图块非常耗时并且占用大量内存。所以我继承了 QGraphicsItem 并覆盖了paint。QGraphicsItem 类中的paint 方法仅在它进入QGraphicsView 内部时被调用。因此,通过在绘画中加载我的图块,我基本上可以创建一个仅在图块出现时才加载图块的应用程序。到目前为止,这很有效。

为了让用户体验更好,我使用 QtConcurrent 尝试在单独的线程中加载磁贴。所以这是我所做的更改。

CPP

LoadTilePixmap 函数:

这段代码应该可以工作,但是一旦调用paint,它就会在运行时崩溃。添加断点后,我将问题缩小到temp->tileItem->paint(painter,option,widget);导致崩溃的范围。

我得到的输出是

谁能帮助我,让我知道为什么 lastline/paint 方法会崩溃。我该如何解决?

编辑代码以更新更改