问题标签 [qfuture]

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 投票
2 回答
288 浏览

c++ - Qt在循环中调用线程

我有一个这样的代码,它的功能double myfunction(double)需要很长时间才能完成。

使用 Qt ( https://doc.qt.io/qt-5/qtconcurrentrun.html ),如何使用线程为每个myfunction调用运行循环以减少计算时间?这有意义吗?

0 投票
1 回答
148 浏览

c++ - Using QtConcurrent::map() function on QList yields segmentation fault

I am familiarizing myself with QtConcurrent library. I have a UI (MainWindow) where I run my functions to simulate a real world example of multithreading.

The QtConcurrent::map() function I am using requires some:

  1. Iterator or a Sequence, in my case I am using a QList.
  2. Further, it requires a MapFunctor (which supports lambdas*) but for this purpose, I am choosing to stick to a static method for testing.

What I have tried

I attempted using both map() functions (the first is left uncommented)

I tried searching for a Sequence and a MapFunctor, but I could only find it in templates which did not help alot, thus I had to try and use my intuition to make sense of it.

The Code:

Somewhere inside my MainWindow.cpp

and the code to start it all

Problem:

Running this snippet of code results in a SEGV here

Stacktrace (copied from debugger)

For the record, there is another question related to this, but most certainly does not provide a usable solution.

Why do I get this SEGV, what is causing this access violation?

0 投票
1 回答
184 浏览

c++ - QtConcurrent - 在发布到 UI 线程的数千个结果中保持 GUI 响应

我有一个应用程序,它可能具有长期运行的任务,也可能有数千或数百万或结果。

这个特定的应用程序(下面的代码)没有任何价值,但它旨在提供一个需要在“数千个”结果中维护响应式 UI 的一般用例。

需要明确的是,我知道应该减少轮询 UI 的次数。我的问题是关于可以应用于此(和其他类似)场景以保持响应式 UI 的设计原则。

我的第一个想法是使用QTimer并每隔 200 毫秒处理一次所有“结果”,可以在此处找到一个示例,但需要添加。

哪些方法可用,哪些方法更适合保持响应式 UI?


我试图解释的一个简单例子如下。我有一个用户界面:

  1. 生成一个整数列表,

  2. 将其传递给映射函数以 pow(x,2) 值,并且

  3. 衡量进度

运行此应用程序时,单击“开始”按钮将运行该应用程序,但由于QueuedConnection : QFutureWatcher::resultReadyAt处理结果的频率,UI 无法响应任何用户点击,因此尝试“暂停”或“停止”(取消)是徒劳的。

传入 lambda的函数的包装器QtConcurrent::mapped()(用于成员函数)

MainWindow.h 用户界面

主窗口实现

解释为什么 UI 没有“响应”。

UI 加载时不执行任何操作,而不是打印“Launching”。调用该方法时on_thread1Start_clicked(),它会启动未来,除了添加以下连接:

此连接侦听来自未来的结果,并对其进行操作(此连接函数在UI 线程上运行)。由于我正在模拟大量的“ui 更新”,如 所示int entries = 50000000;,每次处理结果时,QFutureWatcher<IntStream>::resultReadyAt都会调用 。

虽然它运行了 +/- 2 秒,但 UI 不会响应分别链接到on_thread1PauseResume_clicked()和的“暂停”或“停止”点击on_thread1Stop_clicked

0 投票
0 回答
248 浏览

qt - Qt C++如何正确删除QFutureWatcher?

由于未来的异步,我的代码有时会崩溃。

这不是生产代码,只是演示我想要做的非常简单的东西。

我必须下载一些信息,然后返回第一个获得的结果。试想一下,我不想等待,所以我使用QFutureWatcher的下载速度太快了。

当我获得结果(first或第二个instance)时,我想立即返回结果(我的意思是我不想使用QFutureWatcher::waitForFinished。(如果我从first实例接收到完成的信号,我不再需要那个second。或者对于first.

在生产代码功能中,download我无法访问QNetworkReply,因此无法中止待处理的请求。

有时此代码会崩溃。我究竟做错了什么?

0 投票
1 回答
96 浏览

c++ - 尝试获取文件的 MD5 时 Qt 程序冻结

嗨,我使用此代码在 QT 中生成文件的 MD5

我需要使用此代码(1.5GB>)生成 8 个大文件的 MD5问题是当我按下按钮开始生成 MD5 时,GUI冻结直到所有 MD5 生成
Im Test QFutureQFutureWatcherQtConcurrent以这种方式,但没有运气 GUI 仍然每次冻结

主文件


用户定义.h


主窗口2.h


主窗口2.cpp

谁能说我的问题是什么,我该如何解决?

编辑 1

我以这种方式编辑我的代码,就编码而言,它在没有冻结 gui 的情况下工作得很好,这个代码是标准的吗?

主窗口2.cpp

主窗口2.h

0 投票
1 回答
341 浏览

qt - 从 QWebSocketServer 实时向客户端发送一系列消息

我已经在 QCoreApplication 中实现了一个 websocket 服务器。一旦与客户端建立连接,我希望立即实时向它发送一系列消息,消息0.5之间有几秒钟的延迟。但是,只有在所有消息都已发送后或sendMyMessages()在我的 websocket 服务器的以下实现中方法返回后,单独的消息才会到达客户端。如果我要发送大量消息,客户端必须等待很长时间才能一次性收到所有消息。

MyWebSocketServer.h

MyWebSocketServer.cpp

只有在sendMyMessages()返回之后,客户端才能获得所有消息。它不是实时的。我知道在使用一些异步编程技术之后可以实现我的目标,但我无法找到一种方法来在我的 websocket 服务器实现中进行设置。

这是使用websocketsandasyncio模块在 Python 中为我工作的 websocket 服务器的实现。但是,我希望使用 Qt 在 C++ 中实现相同的逻辑。

0 投票
1 回答
64 浏览

c++ - 在 Qt/C++ 中使用 QFutures 和 OpenCV

cv::VideoCapture我有一个简单的 Qt/C++ 程序,它使用一个对象从我的一个 LAN 设备中收集网络摄像头图像。该应用程序正在使用 Qt Quick 构建,并且有一个ImageQML 项目,500通过自定义 QQuickImageProvider 实现每毫秒提供一张图片:

我的主要功能如下所示:

我的 main.qml 文件的代码在这里应该不重要。

在我的图像提供程序类中,我提供了updateImage如下插槽:

我的问题是,当我的设备无法通过网络访问时,应用程序将完全冻结,因为它卡在_cap.open()功能中。因此,我试图将此功能外包给未来,以便异步加载图像。由于我对线程和期货的概念几乎为零,因此我随机尝试使用 QFutures:

但是,我不会从中得到任何图像输出。

有人可以帮助我如何正确构建代码,以便我可以在这里异步加载我的图像吗?

提前非常感谢。

0 投票
1 回答
244 浏览

python - 在导出的 python 模块中使用异步 c++/qt 函数

我有一个 dll 广泛依赖于 Qt 并导出某些返回 QFuture 的异步函数,例如

我想导出这样的函数(通过pybind11),以便客户可以用python编写脚本。不过,我不想将异步 Qt 接口泄漏到 python 中,因此我正在用 C++ 编写一个包装 API,如下所示:

然后通过pybind11导出:

好吧,这有多个问题,我正在努力如何正确解决这个问题。

首先,我当然需要实例化 aQCoreApplication,以便库中的信号/插槽和事件正常工作。这似乎可行,但我真的不确定这是否被认为是最佳实践以及是否必须调用该exec函数(我不能exec在调用线程上调用,否则它会阻塞):

第二future.result().toStdString();死锁。我可以“修复”这个实例化我自己的QEventLoop,但我不确定这是否是要走的路:

第三,在 dll a 中的某处QTimer被实例化,因此我在 python 中打印出令人讨厌的警告,我很困惑如何处理它:

0 投票
0 回答
54 浏览

c++ - 将 QString 作为参数传递给 QFuture

我需要将文件名作为 QString 传递给 QFuture 中覆盖并由 QFutureWatcher 监视的函数的路径,但只有此 QString 的第一个字符将传递给此函数。这里 *.h 文件中的声明:

这里是函数的调用:

以及函数的代码:

我究竟做错了什么?