asio亂寫——異步timer

ASIO(1.4.3) Tutorial : Timer.2 - Using a timer asynchronously

//
// timer.cpp
// ~~~~~~~~~
//
// Copyright (c) 2003-2008 Christopher M. Kohlhoff (chris at kohlhoff dot com)
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//

#include <iostream>
#include <boost/asio.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>

void print(const boost::system::error_code& /*e*/)
{
  std::cout << "Hello, world!\n";
}

int main()
{
  boost::asio::io_service io;

  boost::asio::deadline_timer t(io, boost::posix_time::seconds(5));
  t.async_wait(print);

  io.run();

  return 0;
}

1. io_service初始化:

new一個新的boost::asio::detail::service_registry對象,賦值service_registry_;

向service_registry_註冊平臺相關的detail::task_io_service<detail::epoll_reactor<false> >服務對象,

該服務對象包括使用的事件分發器(epoll_reactor),事件分發器會在task_io_service的init_task方法中進行註冊;

返回服務對象的引用賦值impl_


2. deadline_timer(io_object)初始化:

typedef basic_deadline_timer<boost::posix_time::ptime> deadline_timer;

deadline_timer是basic_deadline_timer的一個實例類,basic_deadline_timer繼承於basic_io_object;


basic_io_object構造時new一個新的爲該io_object提供對應服務的service對象(deadline_timer_service<Time, TimeTraits>)並向service_registry_註冊;

deadline_timer_service構造時向service_registry_註冊平臺相關的detail::deadline_timer_service<traits_type, detail::epoll_reactor<false> >服務對象,返回服務對象的引用賦值service_impl_;

detail::deadline_timer_service構造時向service_registry_註冊detail::epool_reactor<false>事件分發器服務對象,返回事件分發器對象的引用賦值scheduler_

然後調用detail::epool_reactor的init_task和add_timer_queue方法

detail::epool_reactor的init_task方法中,如果reactor不是獨立的線程,則註冊detail::task_io_service<epoll_reactor<Own_Thread> >服務並調用init_task使用epoll_reactor<Own_Thread>服務對task_進行初始化

detail::epool_reactor的add_timer_queue方法,將一個新的定時器隊列添加到事件分發器


所有io_object都繼承自basic_io_object,其中包括爲該io對象進行服務的IoObjectService以及該io對象的聲明IoObjectService::implementation_type;

所有io_object對象初始化時,將服務對象作爲basic_io_object類參數傳入basic_io_object中並在其構造函數中使用use_service對該服務對象進行註冊並調用服務對象的construct方法對implementation_type進行初始化;

所有io_object對象銷燬時,在basic_io_object析構函數中調用與io_object相對應服務對象的destroy對implementation_type進行銷燬;

所有io_object對象的類模板都以basic開頭,具體的io_object對象則是類模板產生的一個實例類;

所有io_object對象都能獲得對應的用來處理分發處理器以及異步操作的io_object對象;

客戶端向io_object發起請求,io_object先將處理請求發送給平臺無關的服務對象,再由平臺無關的服務對象將請求轉發給平臺相關的服務對象,完成最終的請求。


3. 調用async_wait(handler):

調用deadline_timer的async_wait(...)方法,傳入回調函數,回調函數的類型爲 void handler(const boost::system::error_code&),也可以通過bind方法添加額外的參數

async_wait(...)方法調用相關平臺無關服務(deadline_timer_service)的async_wait,傳入io對象聲明以及回調函數;

平臺無關服務的async_wait(...)再調用平臺相關的服務(detail::deadline_timer_service)的async_wait,傳入io對象聲明以及回調函數

平臺相關服務的async_wait(...)調用反應器(detail::epool_reactor<false>)的schedule_timer方法對該定時器進行計劃,通過wait_handler函數類對原始的handler進行封裝

schedule_timer方法調用enqueue_timer(...)方法將定時器以及回調方法加入到timer_queue(detail::deadline_timer_service的實例變量且detail::epool_reactor<false>保存其引用)

enqueue_timer方法構造新的timer

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章