问题标签 [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 投票
1 回答
3175 浏览

multithreading - 使用 QtConcurrent 运行函数时使用 QMutexLocker 保护共享变量

我使用 QtConcurrent 在后台线程中执行发现过程:

我以前没有放置 Mutex 来保护该函数内的共享变量,这些变量可以在后台线程运行时访问。这在我的“扫描”操作期间导致了一些随机锁定。

我现在已经实现了互斥锁,在该函数的开头创建了一个 QMutexLocker。

这会保护函数内的所有共享变量吗?或者,我应该在每个 m_* 变量周围显式使用 QMutex.lock() 和 unlock() 吗?

谢谢

0 投票
0 回答
589 浏览

qt - 调用 QtConcurrent::run 冻结我的 GUI

我用 QtConcurrent::run 在方法 1(私有插槽)中调用方法 2(私有)异步。有时它运作良好,但有时我的 gui 冻结,我无能为力......

有人有什么想法吗?

0 投票
2 回答
5467 浏览

c++ - 带有 c++11 lambda 的 QtConcurrent.run() 捕获对“this”的引用以发出信号

虽然这可行,但我有一种奇怪的感觉,我的 QObject 发出的不是线程安全的,而且它还没有爆炸的事实只是运气。

那么,捕获引用this会导致问题吗?

因为我认为是,但我找不到明确的答案。

0 投票
1 回答
6840 浏览

c++ - QObject:无法使用 QtConcurrent::run 为位于不同线程中的父级创建子级

我正在尝试在 qt 中使用线程,但在我使用的代码中出现了一些奇怪的错误。

我正在使用线程的函数。

和功能

和我得到的错误

错误的原因是什么,如何解决?谢谢您的回复。

0 投票
1 回答
773 浏览

c++ - 从 QtConcurrent 线程计算中获取项目序列号

QtConcurrent 命名空间非常适合简化多线程计算的管理。总的来说,这很好用,我已经能够按照 API 中描述的方式使用 QtConcurrent run()、map() 和其他变体。

总体的目标:

我想查询、取消()或暂停()来自 QML 的数字密集型计算。 到目前为止,这是我想要的方式,除了我无法访问计算中的序列号。 这是一个描述类似 QML 设置的链接

下面是我创建的用于封装我正在尝试做的事情的小型测试应用程序的图像:

在此处输入图像描述

在上面的示例中,计算几乎完成,所有核心都已正常工作,从系统查询中可以看出:

在此处输入图像描述

但我真正想做的是在多线程计算本身中使用给定项目列表中的序列。例如,一种方法可能是直接在 QList 或 QVector 中设置序列号(其他 C++ STL 容器也可以工作),如下所示:

计算是非阻塞行:_futureWatcher.waitForFinished();注释掉,如上面的代码所示。请注意,当设置为非阻塞计算时,GUI 线程是响应式的,并且进度条会根据需要更新。

但是,当计算期间查询 QList 容器中的值时,似乎是未正确初始化数组时所期望的未初始化垃圾值。

下面是我正在调用的示例函数:

的输出qDebug()是:

s当以这种方式(非阻塞)映射计算时,n 值是无用的,但总和值是正确的(尽管未显示)。

现在,如果我取消注释该_futureWatcher.waitForFinished();行,那么我会得到预期值(顺序无关紧要):

但在这种情况下,_futureWatcher.waitForFinished();启用后,我的 GUI 线程被阻止并且进度条不会更新。

如果目标是不阻塞主 GUI 线程,那么在启用阻塞的情况下使用 QtConcurrent::map() 会有什么好处?

其次,如何n在非阻塞情况下获得正确的值,让 GUI 保持响应并让进度条不断更新?

我唯一的选择可能是直接使用 QThread,但我想利用 QtConcurrent 中为我们设置的所有不错的工具。

想法?建议?其他选择?谢谢。


编辑:感谢 user2025983 的洞察力帮助我解决了这个问题。底线是我首先需要动态分配 QList:

接下来,vectorOfInts通过取消引用指针,通过引用传递给 map 函数,如下所示:

另请注意,mapFunction 的原型保持不变:

然后一切正常:GUI 保持响应,进度条更新,值n全部正确等,无需通过函数添加阻塞:

希望这些额外的细节可以帮助别人。

0 投票
2 回答
173 浏览

c++ - 取消 QtConcurent 计算

我想在事件中取消 QtConcurent::map 计算。

这是我的测试代码(计算由无限循环表示):

我有一个测试列表,我这样做:

目标是在用户单击按钮时取消所有计算。

但是当我单击按钮时,用户界面被冻结,什么也没做。感谢帮助 !

0 投票
1 回答
786 浏览

c++ - Qt Programming - QtConcurrence 杀死线程

我使用 QtConcurrence 在单独的线程中运行函数,但我想停止、暂停或终止该线程,但我不能。我读到这个:

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

我可以用其他任何方式做到这一点吗?

我的功能是:

0 投票
2 回答
762 浏览

c++ - 是否可以在父子目录项目中修改 QT qmake 变量?

我有一个结构如下的共享库项目:

图书馆专业版:

接口2.h:

所以,我的问题是:qmake 只是忽略了SUBDIRS父项目中的变量操作。但它在子项目中工作正常。我究竟做错了什么?

0 投票
1 回答
1942 浏览

c++ - QFutureWatcher 没有调用连接的插槽

我有以下代码,它实现QtConcurrent::run()QFutureWatcher启动fetch()运行 shell 进程的函数。完成后,我想调用该writeDesc函数,但它永远不会被调用。

fetch()工作正常,但程序只显示调试消息Thread done而不显示Slot called. 为什么不writeDesc叫?

0 投票
1 回答
132 浏览

c++ - Qt - 获取数据并通过串行连接转发它们

我正在尝试开发一个简单的 Qt 应用程序。在我按下“开始”按钮后,应用程序应该不断地从设备中检索数据(使用第三方库)并尽快通过串行连接转发它们。

到目前为止,我使用的(丑陋的)软件是一个控制台应用程序,它以顺序方式运行,并在主机提供数据帧后立即获取数据帧,使用以下循环:

我想知道哪种方法在 Qt 中实现这一点更方便,以保持 GUI 的响应性,同时在 getFrame 和串行写入函数之间的延迟最小。

我应该使用计时器触发的 SLOT吗?QtConcurrent 命名空间QRunnable ? 这些方法的主要优点和缺点是什么?

谢谢你的帮助!