什么是Qt for boost::p romise<T>?
What is Qt for boost::promise<T>?
我看到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;
});
希望你觉得它有用。
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 如何防止clang格式在流运算符调用之间添加换行符<<
- <<操作员在下面的行中工作
- EASTL矢量<向量<int>>连续的
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- C :对矢量进行排序&lt; struct&gt;(结构有2个整数)基于结构的整数之一
- 明确的专业化“ CheckIntmap&lt;&gt;”实例化
- 什么是模板&lt;&gt;inline bla bla
- 编辑C Qlist&lt; object*&gt; gt;QML代码和一些QML警告中的模型
- eigen :: llt&lt;eigen :: matrixxd&gt;具有不完整的类型
- 错误,包括&lt; ctype&gt;在原子上使用C 11
- std::vector<;uint8_t>;当C++11/14启用时,手动复制而不是调用memcpy
- 如何加入向量&lt; int&gt;到C 中的单个INT
- 是std :: set&lt; std :: future&gt;不可能存在
- 是numeric_limits&lt; int&gt; :: is_modulo从逻辑上矛盾
- opencv 2.4.7在iOS错误背景_segm.hpp #include&lt; list&gt;未找到
- 在修改列表后,std :: list&lt; t&gt; :: end()的值是否会更改
- ///<评论></评论>在Visual Studio中