2016-10-18 2 views
0

私は、Asioを使ってリモートシステムと会話するプロジェクトを持っています。私はすべてのAsioコードをコンストラクタ内で同期接続を開き、クラスのユーザがソケットに書き込むことができるようにパブリックメソッドを提供するクラスにカプセル化しました。これらのメソッドは、asio::writeを同期させてからasio::async_readを呼び出します。asio :: async_readで使用する正しいパターンは何ですか?

今私の問題:リモートシステムからの

応答時間が不明であるので、私は、ユーザーがそれを待つ必要があります知っている必要があります。私は、ユーザがasio::writeを実行し、asio::async_readというコールバックで再び更新したときに初期化される状態マシンでこれを行うことを考えています。これは、クライアントコードが読まれたコールバックを待っている間に不確定な時間のためにフラグをループしなければならないことを意味します。

変更された状態の呼び出しコードに通知するためのより良いメカニズムはありますか?クライアントコードがループしている場合、asio::async_readのコールバックが呼び出され、フラグが更新されますか?

+1

ほとんどのユーザーインターフェースは、ユーザーインターフェイスを更新することができ、バックグラウンドでメッセージループのいくつかの種類を提供し、私はコールバックハンドラからそのループにメッセージを投稿するだろうしのasio :: async_read。 –

+0

クライアントコードはありますが、UIはありません。更新された質問。 – ruipacheco

+0

あなたのクライアントプログラムには何らかのループが必要です。使用できる既存のループがない場合は、ループを作成する必要があります。 boost condition_variableは、答えを待つのに便利です。あなたが100%確実に答えを受け取らない限り、timed_waitを使用してください。 –

答えて

1

ブースト:: condition_variable使用を次のように

//globals 
boost::mutex mut; 
boost::condition_variable cond; 
bool waitflag = false; 
bool response_available = false; 



// inside async_read callback 
bool waited; 
{ 
    boost::mutex::scoped_lock lock(mut); 
    if ((waited = waitflag)) // check if client loop is waiting for us 
     waitflag = false; 
    response_available = true;// write also any additional data to be read by client here 
} 
if (waited) 
    cond.notify_one(); // notify client 



// inside client loop, use a short waiting time if the loop needs to perform other tasks simultaneously 
{ 
    boost::mutex::scoped_lock lock(mut); 
    if (!response_available) { 
     waitflag = true; // signal that we are waiting for callback 
     cond.timed_wait(lock, boost::posix_time::milliseconds(100)); 
    } 
    if (response_available) { // check if data arrived 
    } 
} 
関連する問題