2017-03-06 10 views
0

ブロッキングコードですが、ブロック非同期に変換するにはどうすればよいですか? クライアントとサーバーの間で非同期通信をしようとしています。 ここに私のブロッキング同期コードです、どうすれば非同期ですか?ブロッキングコードを非同期に変換する

bool S3W::CImplServerData::WaitForCompletion(unsigned int timeout) 
{ 


    unsigned int t1; 
    while (true) 
    { 
     BinaryMessageBuffer currBuff; 
     if (m_Queue.try_pop(currBuff)) 
     { 
      ProcessBuffer(currBuff); 
      t1 = clock(); 
     } 
     else 
     { 
      unsigned int t2 = clock(); 

      if ((t2 - t1) > timeout) 
      { 
       return false; 
      } 
      else 
      { 
       Sleep(1); 
      } 
     } 
    } 

    return true; 
} 
+0

を取得?特定のフレームワークを使用していますか?一部のプラットフォーム固有の機能ですか?詳しく教えてください!そして、[良い質問をする方法を読む](http://stackoverflow.com/help/how-to-ask)、[最小限の、完全で証明可能な例(http: //stackoverflow.com/help/mcve)。 –

+0

私はOGR Apiを使用しています。私は私の投稿を編集します –

答えて

0

移動機能自体の外側のwhileループ:

bool S3W::CImplServerData::WaitForCompletion() 
{ 
    BinaryMessageBuffer currBuff; 
    if (m_Queue.try_pop(currBuff)) 
    { 
     ProcessBuffer(currBuff); 
     // do any processing needed here 
    } 

    // return values to tell the rest of the program what to do 
} 

あなたのメインループはwhileループあなたが "通信" を行うにはどうすればよい

while (true) 
{ 
    bool outcome = S3W::CImplServerData::WaitForCompletion() 

    // outcome tells the main program whether any communications 
    // were received. handle any returned values here 

    // handle stuff you do while waiting, e.g. check for input and update 
    // the graphics 
} 
+0

これは非同期通信ですか?そう多くのコードを書き直す必要はありませんか? –

+0

あなたはマルチスレッドのために行くことができますが、これは、このようなもののために残酷です。 try_popは既に入力をチェックするノンブロッキング関数なので、ブロッキングの問題を回避するために使用することができます。これは、あなたがシングルスレッドアプリケーションで行う方法です。 –

+0

ありがとう! –

関連する問題