Qtにはboost::futureの直接アナログであるfutureクラスがあることがわかりますが、 boost::promiseのqtとは何ですか?
5 に答える
受け入れられた回答に示されているように、独自の QFuture を構築してもうまくいきませんでした。最初は機能しているように見えましたが、私のテストでは、発信者をブロックしていないことに気付きました。おっと!そこで、コードをもう少し掘り下げたところ、「約束」として使用したいのは QFutureInterface であることがわかりました。boost::promise と同様に、QFutureInterface はワーカー スレッドでやり取りするものであり、QFuture のファクトリです。
これが私が 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::promise は、先物に値を設定する手段です。Qt では、future を設定することはできず、返すことしかできません。それが、将来データを「設定」する唯一の方法です。
したがって、future にデータを設定するには、 によって呼び出された関数からそれを返す必要がありますQtConcurrent::run
。これを行うには、スレッド間の通信に Qt のメカニズム (イベント、mutex で保護された変数など) を使用します。特定の future が返されることを、future を返すコードを実行するスレッドに伝える必要があります。これが、promise が行うことを達成する唯一の方法です。
残念ながら、文書化されていない領域に行きたい場合は、次のコードで次のようにboost::promise::setValue
なります。
QFuture<int> f;
int i = 1;
...
f.d.reportResult(&i);
// or
f.d.reportFinished(&i);
(まだ)動作するかどうかを確認していません。
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;
});
お役に立てば幸いです。