【Boost】boost库asio详解4——deadline_timer使用说明
生活随笔
收集整理的這篇文章主要介紹了
【Boost】boost库asio详解4——deadline_timer使用说明
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
deadline_timer和socket一樣,都用io_service作為構(gòu)造函數(shù)的參數(shù)。也即,在其上進(jìn)行異步操作,都將導(dǎo)致和io_service所包含的iocp相關(guān)聯(lián)。這同樣意味著在析構(gòu) io_service之前,必須析構(gòu)關(guān)聯(lián)在這個(gè)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);??
注意后兩種的區(qū)別。以下2種用法是等價(jià)的:
[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));??
前者是絕對(duì)時(shí)間,后者是相對(duì)時(shí)間。
[cpp]?view plain?copy ?print? void?wait();?? void?wait(boost::system::error_code&?ec);??
這是個(gè)同步等待函數(shù),例如:
[cpp]?view plain?copy ?print? boost::asio::io_service?io;?? boost::asio::deadline_timer?t(io,?boost::posix_time::seconds(5));?? t.wait();??
由于不涉及到異步,該函數(shù)和io_service沒什么關(guān)系。這個(gè)函數(shù)在windows下的實(shí)現(xiàn)就只是簡單的sleep。因此也就不存在cancel之說。
template<typename?WaitHandler>?? void?async_wait(WaitHandler?handler);??
注意這個(gè)error很重要,表明這個(gè)handler是因?yàn)槌瑫r(shí)被執(zhí)行還是因?yàn)楸籧ancel。
符合2種情況之一,handler被執(zhí)行:超時(shí)或者被cancel。
這同時(shí)隱含的說明了除非io.stop被調(diào)用,否則handler一定會(huì)被執(zhí)行。即便是被cancel。
被cancel有多種方法,直接調(diào)用cancel或者調(diào)用expires_at,expires_from_now重新設(shè)置超時(shí)時(shí)間。
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秒后執(zhí)行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();?? }?? ?? //?異步循環(huán)執(zhí)行方法:??? 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. 構(gòu)造函數(shù)
在構(gòu)造deadline_timer時(shí)指定時(shí)間。[cpp]?view plain?copy ?print?
[cpp]?view plain?copy ?print?
2. 同步
一個(gè)deadline_timer只維護(hù)一個(gè)超時(shí)時(shí)間,一個(gè)deadline_timer不同時(shí)維持多個(gè)定時(shí)器。[cpp]?view plain?copy ?print?
[cpp]?view plain?copy ?print?
3. 異步
[cpp]?view plain?copy ?print?符合2種情況之一,handler被執(zhí)行:超時(shí)或者被cancel。
這同時(shí)隱含的說明了除非io.stop被調(diào)用,否則handler一定會(huì)被執(zhí)行。即便是被cancel。
被cancel有多種方法,直接調(diào)用cancel或者調(diào)用expires_at,expires_from_now重新設(shè)置超時(shí)時(shí)間。
4. 例子
[cpp]?view plain?copy ?print?總結(jié)
以上是生活随笔為你收集整理的【Boost】boost库asio详解4——deadline_timer使用说明的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Boost】boost库asio详解3
- 下一篇: 【Boost】boost库asio详解5