【Boost】boost库asio详解4——deadline_timer使用说明
生活随笔
收集整理的這篇文章主要介紹了
【Boost】boost库asio详解4——deadline_timer使用说明
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
deadline_timer和socket一樣,都用io_service作為構造函數的參數。也即,在其上進行異步操作,都將導致和io_service所包含的iocp相關聯。這同樣意味著在析構 io_service之前,必須析構關聯在這個io_service上的deadline_timer。
[cpp]?view plain?copy ?print? basic_deadline_timer(?? ????boost::asio::io_service?&?io_service);?? ?? basic_deadline_timer(?? ????boost::asio::io_service?&?io_service,?? ????const?time_type?&?expiry_time);?? ?? basic_deadline_timer(?? ????boost::asio::io_service?&?io_service,?? ????const?duration_type?&?expiry_time);??
注意后兩種的區別。以下2種用法是等價的:
[cpp]?view plain?copy ?print? boost::asio::deadline_timer?t(io,?boost::posix_time::microsec_clock::universal_time()+boost::posix_time::seconds(5));?? boost::asio::deadline_timer?t(io,?boost::posix_time::seconds(5));??
前者是絕對時間,后者是相對時間。
[cpp]?view plain?copy ?print? void?wait();?? void?wait(boost::system::error_code&?ec);??
這是個同步等待函數,例如:
[cpp]?view plain?copy ?print? boost::asio::io_service?io;?? boost::asio::deadline_timer?t(io,?boost::posix_time::seconds(5));?? t.wait();??
由于不涉及到異步,該函數和io_service沒什么關系。這個函數在windows下的實現就只是簡單的sleep。因此也就不存在cancel之說。
template<typename?WaitHandler>?? void?async_wait(WaitHandler?handler);??
注意這個error很重要,表明這個handler是因為超時被執行還是因為被cancel。
符合2種情況之一,handler被執行:超時或者被cancel。
這同時隱含的說明了除非io.stop被調用,否則handler一定會被執行。即便是被cancel。
被cancel有多種方法,直接調用cancel或者調用expires_at,expires_from_now重新設置超時時間。
namespace?? {?? ????void?print(const?boost::system::error_code&)?? ????{?? ????????PRINT_DEBUG("Hello,?world!");?? ????}?? ?? ????void?handle_wait(const?boost::system::error_code&?error,?? ?????????????????????boost::asio::deadline_timer&?t,??? ?????????????????????int&?count)?? ????{?? ????????if(!error)?? ????????{?? ????????????PRINT_DEBUG(count);?? ????????????if(count++?<?5)?? ????????????{?? ????????????????t.expires_from_now(boost::posix_time::seconds(3));?? ????????????????t.async_wait(boost::bind(handle_wait,??? ?????????????????????????????????????????boost::asio::placeholders::error,?? ?????????????????????????????????????????boost::ref(t),?? ?????????????????????????????????????????boost::ref(count)));?? ????????????????if?(count?==?3)?? ????????????????{?? ????????????????????t.cancel();?? ????????????????}?? ?? ????????????}?? ????????}?? ????}??? }?? ?? //?同步方法?? void?test_timer_syn()?? {?? ????boost::asio::io_service?ios;?? ????boost::asio::deadline_timer?t(ios,?boost::posix_time::seconds(3));?? ????PRINT_DEBUG(t.expires_at());?? ????t.wait();?? ????PRINT_DEBUG("Hello?syn?deadline_timer!");?? }?? ?? //?異步方法:?3秒后執行print方法.??? void?test_timer_asyn()?? {?? ????boost::asio::io_service?io;?? ?? ????boost::asio::deadline_timer?t(io,?boost::posix_time::seconds(3));?? ????t.async_wait(print);?? ????PRINT_DEBUG("After?async_wait...");?? ????io.run();?? }?? ?? //?異步循環執行方法:??? void?test_timer_asyn_loop()?? {?? ????boost::asio::io_service?io;?? ????boost::asio::deadline_timer?t(io);?? ????size_t?a?=?t.expires_from_now(boost::posix_time::seconds(1));?? ?? ????int?count?=?0;?? ????t.async_wait(boost::bind(handle_wait,??? ?????????????????????????????boost::asio::placeholders::error,?? ?????????????????????????????boost::ref(t),?? ?????????????????????????????boost::ref(count)));?? ????io.run();?????? }??
1. 構造函數
在構造deadline_timer時指定時間。[cpp]?view plain?copy ?print?
[cpp]?view plain?copy ?print?
2. 同步
一個deadline_timer只維護一個超時時間,一個deadline_timer不同時維持多個定時器。[cpp]?view plain?copy ?print?
[cpp]?view plain?copy ?print?
3. 異步
[cpp]?view plain?copy ?print?符合2種情況之一,handler被執行:超時或者被cancel。
這同時隱含的說明了除非io.stop被調用,否則handler一定會被執行。即便是被cancel。
被cancel有多種方法,直接調用cancel或者調用expires_at,expires_from_now重新設置超時時間。
4. 例子
[cpp]?view plain?copy ?print?總結
以上是生活随笔為你收集整理的【Boost】boost库asio详解4——deadline_timer使用说明的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Boost】boost库asio详解3
- 下一篇: 【Boost】boost库asio详解5