5

Qtにはboost::futureの直接アナログであるfutureクラスがあることがわかりますが、 boost::promiseのqtとは何ですか?

4

5 に答える 5

10

受け入れられた回答に示されているように、独自の 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()て後で呼び出すことができるはずです。

于 2014-03-05T17:59:07.960 に答える
4

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);

(まだ)動作するかどうかを確認していません。

于 2012-06-04T13:59:47.680 に答える
0

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;
});

お役に立てば幸いです。

于 2019-02-19T18:35:25.997 に答える