26 Mart 2018 Pazartesi

process async_pipe ve async_read Kullanımı

Giriş
async_pipe nesnesi async_read() çağrısına geçilir. Genelde belli büüyklükte bellek alanı oluşturulur ve döngü ile okunur. Eğer döngü kurulmazsa bellek doluncaya ve EOF oluncaya kadar çağrı bekler. Çıktı bellek alanından büyükse ve döngü yoksa çalıştırdığımız uygulama takılabilir.

Örnek
Verinin tamamını okumak için şöyle yaparız.
boost::asio::streambuf recv_buffer;
boost::asio::async_read(out, recv_buffer,[&](error_code ec, size_t transferred) {
  ...
});
...

svc.run(); // Await all async operations
Örnek
Şöyle yaparız. Burada 8K'lık bellek ayrılıyor ve bir sefer okunuyor.
std::vector<char> v;

std::error_code build_ec;

v.resize(1024 * 8);

boost::asio::async_read(out, boost::asio::buffer(v),
  [&](const boost::system::error_code &ec, std::size_t size) {
    ...
});
Örnek
Şöyle yaparız. Burada 500 karakterlik bellek ayrılıyor ve döngü içinde okunuyor.
using Loop = boost::function<void()>;
using Buffer = std::array<char, 500>;


Loop read_loop;

Buffer recv_buffer;
std::size_t total_received = 0;
read_loop = [&read_loop, &out, &recv_buffer, &total_received] {
  out.async_read_some(boost::asio::buffer(recv_buffer),
    [&](error_code ec, size_t transferred) {
    
    total_received += transferred; 
    if (!ec)
      read_loop(); // continue reading
    });
};
Döngüyü bir kere başlatmak için şöyle yaparız.
read_loop(); // async

Hiç yorum yok:

Yorum Gönder