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。