2017-03-06 86 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

非常感謝! –