问题标签 [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.
qt - QFutureIterator::next segfaults
我有以下 Qt 代码,在next()
. 我查看了QtConcurrent
代码,这对我来说并不明显,为什么它会失败。
它失败的地方是:
更新:
相同的崩溃QFuture::const_iterator
。
笔记:
如果我能相信GDB, 就this
在. 然后我假设已经是一个,为什么,我不知道。QVector::at
0x0
mapIterator.value().result
nullptr
c++ - 代理 QtConcurrent::run 函数的可变参数模板
我希望创建一个可变参数模板函数,它位于 QtConcurrent::run 函数的前面,该函数执行一些操作,然后传递参数。
QtConcurrent::run 严重超载 - 查看qtconcurrentrun.h
是否可以创建一个我可以调用的可变参数模板函数,该函数将传递给 QtConcurrent::run ?这是我迄今为止所拥有的:
我正在努力研究如何推断返回类型,所以我将 returnT 作为单独的模板参数。当使用以下命令调用时,这不会编译(VS2012 Nov CTP):
最重要的几个错误消息是:
非常感谢任何帮助。
c++ - QtConcurrent::run() 不接受 __stdcall/WINAPI 函数
我试图使用 执行具有__stdcall
调用约定的 DLL 函数QtConcurrent::run()
,但出现编译错误。
我已将问题简化为此示例代码:
如果我删除__stdcall
代码编译并运行良好。否则我会得到这些编译错误:
为什么会发生这种情况,最好的解决方法是什么?
c++ - 为未来的 QThreadPool 线程和/或 pthread_create 调用设置默认堆栈大小
我正在使用 QtConcurrent/QThreadPool,它正在创建堆栈大小的线程,在 Mac OS X 10.8 (512kB) 上太小,但在 CentOS 5.9 (10MB) 上很好。
我希望有一种解决方法,我可以为新线程的堆栈大小设置一些进程范围的默认值。我只关心类似 POSIX 的系统(Mac 和 Linux),暂时不关心 Windows。
我的问题是如何在运行程序之前从程序内部或通过环境变量或其他方式为新的 QThreadPool 线程设置默认堆栈大小?
通过为创建的线程设置默认值来实现效果的答案pthread_create
也将很有用。
我正在尝试解决这个问题:
我的预感是 Qt 在后台使用 pthreads,如果我可以更改 pthreads 的默认堆栈大小,我的问题可能会得到解决。
pthread 文档说:
描述
pthread_create() 函数用于在进程中创建一个新线程,其属性由 attr 指定。如果 attr 为 NULL,则使用默认属性。ETC...
我知道如何获取默认值:
但我还没有找到设置默认值的方法——只能通过传递 apthread_attr_t
来设置大小pthread_create
。
有没有办法设置默认值?
是否有一些环境变量或其他方式来影响默认值?
c++ - QtConcurrent 错误:对非静态成员的引用
我在装有 OS-X 10.8.4 的 Mac 上运行 Qt 5.1 和 QtQuick 2.0。
我的 Qt-QML GUI 变得无响应,因为我用文件 I/O 操作阻塞了事件循环。解决它的常用方法是使用Will Bickford在此处讨论的多个线程。
为此,我正在尝试使用:
这比使用显式 QFuture 对象更简单。我一直在阅读Qt 文档和很酷的示例,并获得了以下代码(仿照此示例):
以下是 DataObject 的头文件和实现文件:
这不是很现实,但可以作为一个简单的草图来说明我在下面遇到的问题。
当我尝试将 QtConcurrent::blockingMapped() 封装在一个额外的“datamodel.h”类中时,就会出现问题:
然后 main() 变成了(注意我也把 load() 方法移到了 DataModel 类中):
但是现在有一个编译器错误:
我无法通过初始化 DataObject 或 DataModel 实例来修复编译器错误(以便可以看到非静态成员函数),并且不确定还有什么可以尝试的。
接下来,我怀疑这可能是由于设置 QtConcurrent 参数时“函子”绑定的问题(我没有安装 boost,所以没有使用boost::bind)所以我尝试了Mat 的建议,即通过替换使用 C++ 11 lambdas :
和:
给出代码:
现在我不再收到非静态成员错误,而是出现了一个新错误(指向上面的行):
我真的在这个问题上陷入了困境,这可能是一个简单的错误,但我很难把它整理出来。
有人可以帮忙吗?
qtconcurrent - 如何知道 qtconcurrent 何时实际运行
如 QtConcurrent::run 的文档中所述:
请注意,该功能可能不会立即运行;该函数仅在线程可用时运行。
所以这里有一个问题:如何处理作业运行?QFutureWatcher 信号启动不合适,因为
当此 QFutureWatcher 开始使用 setFuture() 观察未来集时,会发出此信号。
c++ - QtConcurrent 映射和进度报告
我正在使用 QtConcurrent 进行一些繁重的背景图像处理,并且我想显示图像,同时部分图像正在逐步更新。图像的每一行都是单独计算的,并传递一个函子。
为了计算完整的图像,我有一个我传递给 QtConcurrent 映射的项目序列,并且每行在完成计算时都会发出一个信号
下面是 Worker 类的实例化:
这是报告进度的插槽:
现在的用法:
所有的信号都被发出,但只有当 Qtconcurrent::mapped 完成了序列中的所有项目时,才会调用插槽 onProgressUpdate。
执行时,它在处理序列时有很大的延迟,然后所有插槽都按顺序执行。
我尝试了所有类型的信号/插槽连接,但都没有改变这种行为。
有什么线索吗?
++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++++++ 在Shf建议后编辑+++++++++++ ++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++
到目前为止,该调用是在 main(gui) 线程中进行的。我将呼叫更改为:
由于_computeTreeForFrame
现在在另一个线程中执行,我将对 QtConcurrent::mapped 的调用更改为:
这导致与以前完全相同的行为。
++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++++++ 在Marek R建议后编辑++++++++++ ++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++
好的,所以我做了这样的测试,这是我观察到的:
QtConcurrent::map :
- 不发出信号
resultReadyAt(int)
QtConcurrent::mapped
resultReadyAt(int)
仅在完成时发出
对 map 函数的调用是否在单独的线程中完成并不重要,会遇到相同的行为。
progressValueChanged(int)
正如 Qt progressDialog 示例所暗示的那样,我还尝试了该信号。信号progressValueChanged(int)
仅在图像中的 2 行(第一行和最后一行)中发出。这真的很奇怪,因为在 Qt 进度对话框示例中它是顺利发出的。
我对 Qt 示例进行了一些更改,以在主线程之外的另一个线程中启动 map 函数,在这种情况下它仍然可以正常工作。
问题必须来自其他地方。
也许 GUI 事件循环正在做一些我没想到的事情?我不知道是什么。
我现在将尝试 QtConcurrent::mappedReduced 并报告结果:-)
++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++
它不起作用,只有在“map”函数完成时才调用“reduce”函数。换句话说,它的作用与之前的信号/槽机制相同。
我现在的可能性很低
++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++++++编辑我回到了一个与Qt进度对话框一样接近的解决方案示例 +++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++++++++
如果我不能得到与 Qt 示例相同的行为,那一定是有问题。
这是现在的代码:
对 computeTreeForFrame 的调用...
这个调用是在一个 slot中完成的。
如前所述,它为第 0 行和最后一行发出信号,但不发出任何其他信号。
这不应该完全像 Qt 示例所做的那样吗?
c++ - How to map QtConcurrent on a QList of QVector and reduce into one QVector
I really tried to combine everything I know in order to make this work. I believe there will be no problem with deadlock or other thread issues in the current structure. However, some pieces are missing, and the available documentation is not helping me (I am not experienced in C++ documentation).
From the input of QList holding 3 vectors with all ones, I would like to go into one vector, for which every vector has added some iteration variable.
I would expect as a result in qDebug()
to see:
Here what I assume to be the missing pieces:
- What about the
QtConcurrent:mappedReduced()
, am I giving the correct arguments? - What about the functions returns, how should these be sorted out?
- What exactly is needed to be included, do I just need to include QtConcurrent?
- Once this starts working, and the list would be huge, as far as I understand QtConcurrent will do the thread management (use available cores), and all the items of the list (even if not the same size) will be passed smartly to the threads not to have them idle?
Edit (maybe it is a problem that it happens on a button click?):
While it was working for my example, what can be wrong when I use this:
Chokes on: res = QtConcurrent::mappedReduced(holder, correlate, Reduce, QtConcurrent::SequentialReduce);
Var: QList< QVector<double> > holder;
Functions involved:
and
error: no matching function for call to 'mappedReduced(QList<QVector<double> >&, <unresolved overloaded function type>, <unresolved overloaded function type>, QtConcurrent::ReduceOption)'
And also: "could not deduce template parameter ResultType"
It is the same thing as a working thing in the console application.
multithreading - 停止由 QtConcurrent::run 启动的线程?
是否可以通过关联的 QFuture Object 停止线程?目前我一直在开始这样的视频捕捉过程。
在 startLiveCapturing-Method 内部,一个无限循环正在运行,用于捕获图像并显示它们。因此,如果用户想要停止该过程,他只需按下一个按钮,该操作就会停止。但似乎我不能通过调用这样的取消方法来停止这个线程?
我做错了什么以及如何停止该线程或操作。
c++ - 使用 QtConcurrent 在 QT 中进行多线程
我在 Qt 中开发了一个应用程序,它有时会处理一堆视频。它工作正常,但在进程阶段它只有 40-60% 的 cpu 使用率,所以我试图让它成为多线程的。
我使用 QtConcurrent 导致他的“高度”而不是更传统的线程管理,我的代码很简单:
aaaand 它可以工作,100% 的 CPU 使用率和大约 25-30% 的速度。但它会产生大约 65 个新线程(不管它处理 25 或 250 个视频),并且这些线程中的大多数在处理阶段后都不会消失。
我的问题是:这种方法对吗?是不是太生了?我应该“手动”控制线程创建吗?QtConcurrent 模块是否会处理所有问题,所以我不应该关心线程管理?85个线程太多了吗?我应该在流程阶段之后尝试杀死其中一些吗?
只需查看活动监视器即可完成所有观察。
提前致谢。