2017-02-12 91 views
1

我使用Boost.Asio,但這個問題應該涵蓋任何異步框架。如何使用異步庫實現繁忙信號?

我有一個通過網絡發送和接收數據的類。我想給我的用戶讀取和寫入方法以及一個is_busy()讓他們檢查數據何時可用。現在,我有寫方法的完成處理程序觸發一個後臺線程,讀取並返回未來,而read()方法從未來讀取。 write方法將bool設置爲true,並且在返回數據時讀取線程將其設置爲false。

有沒有更好的方法?如果我使用Asio正確理解它,我需要完成處理程序,但沒有辦法告訴我的用戶數據還沒有抵達,沒有阻塞。

更新

代碼示例:

void Socket::write(const vector<byte> input) { 
    busy_ = true; 
    read_buffer_.clear(); 
    socket_->async_write_some(asio::buffer(input), [&](const std::error_code ec, const size_t length) { 
    if (ec && ec != asio::error::operation_aborted) { 
     throw std::system_error(ec); 
    } 
    if (ec == asio::error::operation_aborted) { 
     return; 
    } 
    read_f = std::async(std::launch::async, [&]() { 
     socket_->async_read_some(asio::null_buffers(), [&](const std::error_code ec, const size_t length) { 
      if (ec && ec != asio::error::operation_aborted) { 
      throw std::system_error(ec); 
      } 
      if (ec == asio::error::operation_aborted) { 
      return; 
      } 
      read_buffer_.resize(socket_->available()); 
      socket_->read_some(asio::buffer(read_buffer_)); 
      busy_ = false; 
     }); 
     unsigned long a = service_.run(); 
     service_.reset(); 
     busy_ = false; 
     return a; 
     }); 
}); 
+0

請提供未來閱讀和寫作的代碼。 – stark

+0

@stark添加代碼示例。 – ruipacheco

+0

協程似乎是這裏更簡單的方法。 – Arunmu

回答

1

我解決了這個問題,通過使用asio::socket_base::bytes_readable,以檢查是否有插座準備數據被讀取,如果字節數爲0我只是睡一會兒微秒。