日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【Boost】boost库asio详解4——deadline_timer使用说明

發布時間:2024/4/11 编程问答 56 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Boost】boost库asio详解4——deadline_timer使用说明 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
deadline_timer和socket一樣,都用io_service作為構造函數的參數。也即,在其上進行異步操作,都將導致和io_service所包含的iocp相關聯。這同樣意味著在析構 io_service之前,必須析構關聯在這個io_service上的deadline_timer。

1. 構造函數

在構造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));??
  • 前者是絕對時間,后者是相對時間。

    2. 同步

    一個deadline_timer只維護一個超時時間,一個deadline_timer不同時維持多個定時器。
    [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之說。

    3. 異步

    [cpp]?view plain?copy ?print?
  • 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重新設置超時時間。

    4. 例子

    [cpp]?view plain?copy ?print?
  • 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();??????
  • }??
  • 總結

    以上是生活随笔為你收集整理的【Boost】boost库asio详解4——deadline_timer使用说明的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。