20 Nisan 2017 Perşembe

asio steady_timer Sınıfı

Giriş
Şu satırı dahil ederiz.
#include <boost/asio/steady_timer.hpp>
Chrono monotonic saatini kullanır. Daha rahat kullanmak için şu satırı dahil ederiz.
using boost::asio::steady_timer;
Bu timer için kullanılan çağıları görmek için şöyle yaparız.
#define BOOST_ASIO_ENABLE_HANDLER_TRACKING 1
Çıktıyı görmek için şu uygulamayı kullanırız.
boost/libs/asio/tools/handlerviz.pl
Periyodik Timer
Handler içinde (eğer error_code atanmamış ise) şöyle yaparız.
void handle_timeout(const boost::system::error_code& ec)
{
  if (!ec) {
    t.expires_from_now (...); //tekrar kur
    t.async_wait (handle_timeout);
  }
}
restart
Asio timer sınıfları periyodik değiller. Aynı zamanda durdurup tekrar başlatma imkânı da vermiyorlar. Ancak bu metodları yazması kolay. Şöyle yaparız.
t.cancel ();
t.expires_from_now (...);
t.asynx_wait (...);

Constructor
Şöyle yaparız.
boost::asio::io_service ios;
boost::asio::steady_timer t (ios);
Constructor - time
Şöyle yaparız.
steady_timer t {ios, std::chrono::seconds{3}};
Destructor
Açıklaması şöyle
It is safe for a timer to be destroyed with outstanding wait operations. The outstanding wait operations will be implicitly cancelled within the timer's destructor.

async_wait metodu
Şöyle yaparız.
t.async_wait([](const boost::system::error_code &ec)
  {...});
cancel metodu
Başlatılmış bir timer nesnesini iptal etmek içindir. Şöyle yaparız.
t.cancel();
Handle metodunda hata kontrolu için şöyle yaparız.
void handle_timeout(const boost::system::error_code& ec)
{
  if (!ec) {
    ...
  } 
  else if (ec != boost::asio::error::operation_aborted) {
    std::cerr "handle_timeout error " << ec.message() << "\n";
  }
}
expires_at metodu
Şöyle yaparız.
t.expires_at(Timer::clock_type::time_point::min());
expires_from_now metodu - getter
Şöyle yaparız.
if(t.expires_from_now() <= std::chrono::seconds(0))
  ...
}
expires_from_now metodu - setter
Şöyle yaparız.
t.expires_from_now (boost::posix_time::seconds(5));
Şöyle yaparız.
t.expires_from_now (boost::chrono::seconds(5));
Şöyle yaparız. Ben hep bu yöntemi kullandım.
t.expires_from_now (std::chrono::seconds(5));
get_io_service metodu
Şöyle yaparız.
timer.get_io_service().post([](){
  ...
});


Hiç yorum yok:

Yorum Gönder