gpt4 book ai didi

c++ - 自定义创建 QFuture

转载 作者:行者123 更新时间:2023-12-02 10:20:48 29 4
gpt4 key购买 nike

我遇到了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对于我的结果,问题将得到解决。
谁能指出我的解决方案或解决方法?将不胜感激任何聪明的想法。

更新:

@VladimirBershov 提供了一个很好的现代解决方案,它实现了观察者模式。经过一番谷歌搜索,我找到了 QPromise图书馆。当然,构造自定义 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


将来自 QObject 的信号转换为 QFuture 对象:
#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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com