什么是Qt for boost::p romise<T>?

What is Qt for boost::promise<T>?

本文关键字:lt gt Qt for boost 什么 romise      更新时间:2023-10-16

我看到Qt有未来类,它是boost::future的直接模拟,但是boost::p romise的qt是什么?

按照

接受的答案中所示构建我自己的 QFuture 对我不起作用。 起初它似乎正在工作,但在我的测试中,我意识到它并没有阻止呼叫者。哎 呦! 所以我进一步深入研究了代码,发现QFutureInterface是你想用作你的"承诺"的东西。 与 boost::p romise 一样,QFutureInterface 是您在工作线程中与之交互的内容,它是 QFutures 的工厂。

所以这是我在Qt 4.8中一直在做的事情(不确定这是否适用于更高版本)。

QFutureInterface<QVariant> promise;
promise.reportStarted();
...
promise.reportResult(someVariant);
promise.reportFinished();

然后在客户端线程中,假设您可以访问 QFutureInterface 'promise'

QVariant result = promise.future().result();

future()调用是一种工厂方法,用于创建绑定到 QFutureInterface 的 QFuture。 如果您愿意,您应该能够获得 QFuture 并在稍后致电result()

boost::p romises 是在期货中设定价值的手段。在Qt中,你不能设置期货,你只能返回它们。这是将来"设置"数据的唯一方法。

因此,为了在将来设置数据,您必须从 QtConcurrent::run 调用的函数返回它。为此,您可以使用Qt的任何机制在线程之间进行通信 - 事件,受互斥锁保护的变量等。您必须告诉运行代码的线程,该线程将返回给定的未来。这是实现承诺的唯一途径。

唉,如果你想进入无证领域,那么下面的代码会做boost::promise::setValue会做的事情:

QFuture<int> f;
int i = 1;
...
f.d.reportResult(&i);
// or
f.d.reportFinished(&i);

我还没有费心检查它是否有效(还没有)。

没有官方的Qt模拟,但有一些社区库实现了承诺(或类似的模式):

  • Ben Lau's AsyncFuture (benlau/asyncfuture)
    基于其他答案之一中提到的未记录QFutureInterface
    这不完全是一个承诺模式,而是一个观察者模式。
  • Benoit Walter's QtPromise (bwalter/qt-promise)
    部分基于Ben Lau的AsyncFuture。
  • Simon Brunel's QtPromise (simonbrunel/qtpromise)
  • My QtPromise
  • (julrich/QtPromise)
    免责声明:我是作者。

Qt 的承诺现在也可以在 QML/JavaScript 中提供:https://v-play.net/updates/release-2-18-1-javascript-promises-for-rest-services-tinder-swipe-material-cards-qml-qsortfilterproxymodel-qml-youtube-player

下面是一些示例代码:

import VPlayApps 1.0
import QtQuick 2.0
App {
  Component.onCompleted: {
    var p1 = Promise.resolve(3);
    var p2 = 1337;
    var p3 = HttpRequest
    .get("http://httpbin.org/get")
    .then(function(resp) {
      return resp.body;
    });
    var p4 = Promise.all([p1, p2, p3]);
    p4.then(function(values) {
      console.log(values[0]); // 3
      console.log(values[1]); // 1337
      console.log(values[2]); // resp.body
    });
  }
}

我创建了这个与Qt高度集成并实现类似JavaScript的承诺的库:

https://github.com/juangburgos/QDeferred

它允许创建线程安全的异步API,如下所示:

multiplyNumbersInThread(3, 4)
.fail([](int res) {
    Q_UNUSED(res);
    qDebug() << "multiplyPositiveNumbers failed!";
})
.done([](int res) {
    qDebug() << "multiplyPositiveNumbers succeded! Result :" << res;
});

希望你觉得它有用。