- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我遇到了QtConcurrent
的一个很奇怪的问题。 ,主要是因为奇怪的编程欲望,也许这只是一个XY问题,但是......
所以,有我的代码,试图与数据库通信,实际上是一个后端代码(在 Qt 上,是的)。它必须快速工作并处理一些请求,所以我需要一个线程池。作为一个众所周知的事实,我认为建立连接本身是一个非常耗时的操作,因此需要持久的数据库连接导致持久的线程(QSqlDatabase
不能在线程之间移动)。此外,需要异步请求处理是很自然的,因此需要一种简单的方法将它们传递给持久线程。
没什么太复杂的,让我们假设已经存在一些样板文件,比如......
// That's what I want for now
QFuture<int> res = workers[i]->async(param1, param2);
// OR
// That's what I DO NOT want to get
workers[i]->async(param1, param2, [](QFuture<int> res) { // QFuture to pass exceptions
// callback here
});
std::future
?嗯,使用起来要容易得多
QFutureWatcher
它是关于结果准备就绪的通知信号。纯 C++ 通知解决方案要复杂得多,而且回调也必须在类层次结构中拖动。显然,每个工作人员都将一个线程与数据库连接连接起来。
QtConcurrent
方便,似乎只有冒险的方法来创建
QFuture
以便它可以由自定义工作人员返回。
QThreadPool
没有用,因为在其中创建持久的可运行文件将是一个大故事。多说一句,我简单描述的样板将是某种项目的核心,在很多地方都使用,而不是用 100 个手工线程管理轻松替换的东西。
QFuture
对于我的结果,问题将得到解决。
QFuture
仍然很老套,只能通过未记录的
QFutureInterface
来完成类,但据我判断,仍然有一些“类似 promise ”的解决方案使异步调用更整洁。
最佳答案
您可以使用AsyncFuture自定义库QFuture
创作工具或创意来源:
AsyncFuture - Use QFuture like a Promise object
QFuture is used together with QtConcurrent to represent the result of an asynchronous computation. It is a powerful component for multi-thread programming. But its usage is limited to the result of threads, it doesn't work with the asynchronous signal emitted by QObject. And it is a bit trouble to setup the listener function via QFutureWatcher.
AsyncFuture is designed to enhance the function to offer a better way to use it for asynchronous programming. It provides a Promise object like interface. This project is inspired by AsynQt and RxCpp.
- Convert a signal from QObject into a QFuture object
- Combine multiple futures with different type into a single future object
- Use Future like a Promise object
- Chainable Callback - Advanced multi-threading programming model
#include "asyncfuture.h"
using namespace AsyncFuture;
// Convert a signal from QObject into a QFuture object
QFuture<void> future = observe(timer, &QTimer::timeout).future();
/* Listen from the future without using QFutureWatcher<T>*/
observe(future).subscribe([]() {
// onCompleted. It is invoked when the observed future is finished successfully
qDebug() << "onCompleted";
},[]() {
// onCanceled
qDebug() << "onCancel";
});
关于c++ - 自定义创建 QFuture,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60268353/
我有一个函数返回 QFuture 对象作为 QtConcurrent::run 计算的结果。但是,在运行并发方法之前可能存在某些情况,我需要从我的函数中手动返回一个持有值(value)的 future
我遇到了QtConcurrent 的一个很奇怪的问题。 ,主要是因为奇怪的编程欲望,也许这只是一个XY问题,但是...... 所以,有我的代码,试图与数据库通信,实际上是一个后端代码(在 Qt 上,是
我可以将另一个 QFuture 对象分配给已经运行的 QFuture 对象吗?就像下面的例子: QFuture future = QtConcurrent::run(function); futu
我正在使用 Qt 进行黑莓 10 开发。我正在使用 QFuture,QtConcurent::run。所以这是我的代码: applicationui.cpp LoadData* Data = new
我正在尝试使用 QT 的 QFuture 和 QFutureWatcher 来实现带有通知的工作线程,但是通知没有在正确的时间出现! 我正在从菜单处理程序调用 loadFile(QString),并期
我在QTConcurrent::run中使用QFuture 在后台线程中运行一些代码。我想从主线程中检测此后台代码中的异常。 根据Notification about exceptions in Qt
我目前正在开发一个编辑器程序;我需要编写一个功能,它需要使用项目的异步文件 API 连续加载多个文件,然后在加载这些文件后执行更多计算。 在另一种语言中,这可能会通过 async/await 工作流来
我有以下有效的代码(但它不应该有效) void myfunction(){ auto future = function_which_return_future(); auto *watche
我正在编写一个使用 QtConcurrent 的程序启动线程。在我的例子中,当我使用鼠标滚动时,我用它来渲染 QGraphicsView。 我正在使用以下代码启动线程: if (future.isRu
我需要一个超时函数调用。我主要使用 Qt(4.7.3、4.8.5)工作,所以我试图找到 Qt 的解决方案。 QFuture 和 QtConcurrent 这两个类似乎完成了我需要的 99%,但我找不到
我试图让我的应用程序在多个线程上运行,以提高其进程的效率。我在 Qt 的网站上找到了 QFuture可以帮助我的模板类。我试图在他们的一个例子中使用 like 。以下是我的类声明/定义的一部分。 cl
我有一个带有 QThread 的程序,其中包含一个网络客户端。客户端应该获取一个对象,对其进行处理,将其上传到服务器,获取响应,然后向主线程报告。我用 std::promise 做到了这一点,并使用了
主 GUI 线程在等待 QFuture 时更新 QProgressDialog 的正确方法是什么。具体来说,这个循环中发生了什么: QProgressDialog pd(...); QFuture f
void QFutureWatcher::resultReadyAt(int index) 当观察到的 future 在 index 报告准备好的结果时,会发出此信号。如果 future 报告了多个结
所以我发现我的 UI 程序出现了一些问题,因为我没有使用线程。 我看了一下,从我在文档中看到的 QFuture 似乎是我需要的,我认为当你有一个函数并且你只想在线程中运行它时使用它是正确的吗? 是的,
所以我已经使用 QtConcurrent::run 一段时间了,它很棒。但是现在我需要函数来返回一个对象。因此我使用伪代码 QFutureWatcher fw; QFuture t1 = QtConc
Qt 是否提供与Concurrency::event 行为方式大致相同的同步原语?来自 Microsoft 的并发运行时? 具体来说,我希望线程 A 中的 wait() 返回,即使它在线程 B 已经调
我是一名优秀的程序员,十分优秀!