boost.asio框架系列之定時(shí)器Timer
同步Timer
asio中提供的timer名為deadline_timer,它提供了超時(shí)計(jì)時(shí)的功能。首先以一個(gè)最簡(jiǎn)單的同步Timer為例來(lái)演示如何使用它。
#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;
}首先常見(jiàn)了一個(gè)io_service對(duì)象,它提供了IO調(diào)度功能,asio庫(kù)中的所有io操作都是基于它來(lái)執(zhí)行的。然后創(chuàng)建了一個(gè)deadline_timer對(duì)象,它有兩個(gè)參數(shù),一個(gè)是io_service對(duì)象,另一個(gè)是超時(shí)時(shí)間。
創(chuàng)建了timer后,就可以調(diào)用wait函數(shù)來(lái)阻塞等待至timer超時(shí)了,它還有一種可以指定錯(cuò)誤碼的入?yún)⒌闹剌d形式,關(guān)于錯(cuò)誤碼后面再介紹。
異步Timer
同步timer雖然簡(jiǎn)單,但由于其會(huì)阻塞,在實(shí)際的項(xiàng)目中并不常用,而往往使用的是異步timer:指定一個(gè)回調(diào)函數(shù),計(jì)時(shí)器超時(shí)后執(zhí)行回調(diào)函數(shù)。asio中實(shí)現(xiàn)異步timer比較簡(jiǎn)單,示例如下:
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;
}和同步方式相比,它主要有兩點(diǎn)不同:
調(diào)用的是非阻塞函數(shù)async_wait,它的入?yún)⑹且粋€(gè)回調(diào)函數(shù)。
顯式調(diào)用io_service.run()函數(shù)驅(qū)動(dòng)異步IO調(diào)度。
取消Timer
Timer還有一種常用操作是取消Timer,基本方法如下:
調(diào)用timer的cancel函數(shù)取消timer
timer取消后,回調(diào)函數(shù)會(huì)立即執(zhí)行,通過(guò)err_code可以感知到計(jì)時(shí)器是否已經(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超時(shí)時(shí)間
可以通過(guò)expires_from_now和expires_at兩個(gè)函數(shù)更改Timer的超時(shí)時(shí)間,如下示例就通過(guò)它實(shí)現(xiàn)一個(gè)周期計(jì)時(shí)器。
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;
}到此這篇關(guān)于boost.asio框架系列之定時(shí)器Timer的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C 語(yǔ)言基礎(chǔ)教程(我的C之旅開(kāi)始了)[十]
C 語(yǔ)言基礎(chǔ)教程(我的C之旅開(kāi)始了)[十]...2007-02-02
C++有限狀態(tài)機(jī)實(shí)現(xiàn)計(jì)算器小程序
這篇文章主要為大家詳細(xì)介紹了C++有限狀態(tài)機(jī)實(shí)現(xiàn)計(jì)算器小程序的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06
詳解如何用c++實(shí)現(xiàn)平衡二叉樹(shù)
平衡二叉樹(shù)(Balanced Binary Tree)又被稱為AVL樹(shù)(有別于AVL算法),由前蘇聯(lián)的數(shù)學(xué)家Adelse-Velskil和Landis在1962年提出的高度平衡的二叉樹(shù),根據(jù)科學(xué)家的英文名也稱為AVL樹(shù)。本文介紹了它的原理和如何用C++代碼來(lái)實(shí)現(xiàn)2021-06-06
關(guān)于C++使用std::chrono獲取當(dāng)前秒級(jí)/毫秒級(jí)/微秒級(jí)/納秒級(jí)時(shí)間戳問(wèn)題
這篇文章主要介紹了C++使用std::chrono獲取當(dāng)前秒級(jí)/毫秒級(jí)/微秒級(jí)/納秒級(jí)時(shí)間戳,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07
Visual?studio2022?利用glfw+glad配置OpenGL環(huán)境的詳細(xì)過(guò)程
這篇文章主要介紹了Visual?studio2022?利用glfw+glad配置OpenGL環(huán)境,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-10-10
C++中圖片類型的識(shí)別與轉(zhuǎn)換詳解方法
本文簡(jiǎn)單的介紹一下C++語(yǔ)言中如何識(shí)別圖片文件的類型,以及各圖片類型之間的轉(zhuǎn)換方法,并提供相關(guān)的源碼供大家參考,感興趣的朋友快來(lái)看看吧2021-11-11

