1

私のプロジェクトのアプリケーションは、これまで同期呼び出しを使用してqtdbusを介して通信していました。ただし、これらの呼び出しのいくつかを非同期に変換する必要があります。そのために、qtdbus QDBusAbstractInterface :: callWithCallbackで利用可能なこのAPIを使用することを選択しましたが、問題は、現在の実装では、これらのqtdbus同期呼び出しがコード内の多くの場所に散在しており、これらの同期呼び出しに続くコードスニペットが制御を前提としていることです。前のコールが正常に処理され、応答が取得された場合にのみ、それらに到達します。これは、呼び出しが非同期に変更された場合には当てはまりません。さらに、呼び出しはさまざまなコンテキストで行われるため、各qtdbus呼び出しの前にシステムの状態を維持する必要があります。これにより、応答を受信したときに何をすべきかがわかります。現在のコードの構造を大きく破壊することなく、呼び出しを非同期に変換する可能性は本当にありますか?私が考えることができる1つのアプローチは、FSMパターンを使用することです。ヒントやデザインの提案は大歓迎です。ありがとう!

4

1 に答える 1

0

私が理解しているのは、同じメソッドを呼び出してから、呼び出し時の状態に基づいて戻り値を異なる方法で処理する必要があるということです。そのような

void function()
{
    //do stuff
    value = SynchronousCall();
    if (state == 1)
    {
        doSomething(value);
    }
    else
    {
        doSomethingElse(value);
    }
}

追加するクラスの数を混乱させる可能性のある有限状態マシンパターンの完全な実装の代わりに、状態ごとに個別のメソッドを追加することをお勧めします

void function()
{
    //do stuff
    if (state == 1)
    {
        callback = *doSomething(ValueType);
    }
    else
    {
        callback = *doSomethingElse(ValueType);
    }
    callWithCallback(method,args, receiver,callback,error);

}

次に、各メソッドで状態を想定し、それに応じて戻り値を処理できます。

もう1つの少し(非常に)ハッキーな方法は、すべての非同期呼び出しの後にスピンQThread:: yield()を待機させ、値が返されるのを待つ間、ループでaを使用することです。そうすれば、技術的には非同期呼び出しですが、同期的に動作します。

于 2012-06-13T18:00:26.280 に答える