boost.asio框架系列之定時器Timer
同步Timer
asio中提供的timer名為deadline_timer,它提供了超時計時的功能。首先以一個最簡單的同步Timer為例來演示如何使用它。
#include <iostream> #include <boost/asio.hpp> int main() { boost::asio::io_service io; boost::asio::deadline_timer timer(io, boost::posix_time::seconds(3)); timer.wait(); std::cout << "Hello, world!\n"; return 0; }
首先常見了一個io_service對象,它提供了IO調度功能,asio庫中的所有io操作都是基于它來執(zhí)行的。然后創(chuàng)建了一個deadline_timer對象,它有兩個參數(shù),一個是io_service對象,另一個是超時時間。
創(chuàng)建了timer后,就可以調用wait函數(shù)來阻塞等待至timer超時了,它還有一種可以指定錯誤碼的入?yún)⒌闹剌d形式,關于錯誤碼后面再介紹。
異步Timer
同步timer雖然簡單,但由于其會阻塞,在實際的項目中并不常用,而往往使用的是異步timer:指定一個回調函數(shù),計時器超時后執(zhí)行回調函數(shù)。asio中實現(xiàn)異步timer比較簡單,示例如下:
void print(const boost::system::error_code& /*e*/) { std::cout << "Hello, world!\n"; } int main() { boost::asio::io_service io; boost::asio::deadline_timer timer(io, boost::posix_time::seconds(5)); timer.async_wait(&print); io.run(); return 0; }
和同步方式相比,它主要有兩點不同:
調用的是非阻塞函數(shù)async_wait,它的入?yún)⑹且粋€回調函數(shù)。
顯式調用io_service.run()函數(shù)驅動異步IO調度。
取消Timer
Timer還有一種常用操作是取消Timer,基本方法如下:
調用timer的cancel函數(shù)取消timer
timer取消后,回調函數(shù)會立即執(zhí)行,通過err_code可以感知到計時器是否已經(jīng)被取消
void print(const boost::system::error_code& err) { if(err) { std::cout << "timer is canceled\n"; return; } std::cout << "Hello, world!\n"; } int main() { boost::asio::io_service io; boost::asio::deadline_timer timer(io, boost::posix_time::seconds(5)); timer.async_wait(&print); boost::asio::deadline_timer timer2(io, boost::posix_time::seconds(2)); timer2.wait(); timer.cancel(); io.run(); return 0; }
更改Timer超時時間
可以通過expires_from_now和expires_at兩個函數(shù)更改Timer的超時時間,如下示例就通過它實現(xiàn)一個周期計時器。
typedef std::function<void (const boost::system::error_code&)> timer_callback ; void print(const boost::system::error_code&) { std::cout << "Hello, world!\n"; } int main() { boost::asio::io_service io; boost::asio::deadline_timer timer(io, boost::posix_time::seconds(1)); timer_callback callback = [&](const boost::system::error_code& err) { print(err); timer.expires_at(timer.expires_at() + boost::posix_time::seconds(1)); timer.async_wait(callback); }; timer.async_wait(callback); io.run(); return 0; }
到此這篇關于boost.asio框架系列之定時器Timer的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
關于C++使用std::chrono獲取當前秒級/毫秒級/微秒級/納秒級時間戳問題
這篇文章主要介紹了C++使用std::chrono獲取當前秒級/毫秒級/微秒級/納秒級時間戳,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-07-07Visual?studio2022?利用glfw+glad配置OpenGL環(huán)境的詳細過程
這篇文章主要介紹了Visual?studio2022?利用glfw+glad配置OpenGL環(huán)境,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-10-10