私は、Asioを使ってリモートシステムと会話するプロジェクトを持っています。私はすべてのAsioコードをコンストラクタ内で同期接続を開き、クラスのユーザがソケットに書き込むことができるようにパブリックメソッドを提供するクラスにカプセル化しました。これらのメソッドは、asio::write
を同期させてからasio::async_read
を呼び出します。asio :: async_readで使用する正しいパターンは何ですか?
今私の問題:リモートシステムからの
応答時間が不明であるので、私は、ユーザーがそれを待つ必要があります知っている必要があります。私は、ユーザがasio::write
を実行し、asio::async_read
というコールバックで再び更新したときに初期化される状態マシンでこれを行うことを考えています。これは、クライアントコードが読まれたコールバックを待っている間に不確定な時間のためにフラグをループしなければならないことを意味します。
変更された状態の呼び出しコードに通知するためのより良いメカニズムはありますか?クライアントコードがループしている場合、asio::async_read
のコールバックが呼び出され、フラグが更新されますか?
ほとんどのユーザーインターフェースは、ユーザーインターフェイスを更新することができ、バックグラウンドでメッセージループのいくつかの種類を提供し、私はコールバックハンドラからそのループにメッセージを投稿するだろうしのasio :: async_read。 –
クライアントコードはありますが、UIはありません。更新された質問。 – ruipacheco
あなたのクライアントプログラムには何らかのループが必要です。使用できる既存のループがない場合は、ループを作成する必要があります。 boost condition_variableは、答えを待つのに便利です。あなたが100%確実に答えを受け取らない限り、timed_waitを使用してください。 –