您好,登錄后才能下訂單哦!
這篇文章主要介紹“boost.asio框架系列之定時(shí)器Timer怎么使用”,在日常操作中,相信很多人在boost.asio框架系列之定時(shí)器Timer怎么使用問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”boost.asio框架系列之定時(shí)器Timer怎么使用”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!
asio中提供的timer名為deadline_timer,它提供了超時(shí)計(jì)時(shí)的功能。首先以一個(gè)最簡單的同步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; }
首先常見了一個(gè)io_service對象,它提供了IO調(diào)度功能,asio庫中的所有io操作都是基于它來執(zhí)行的。然后創(chuàng)建了一個(gè)deadline_timer對象,它有兩個(gè)參數(shù),一個(gè)是io_service對象,另一個(gè)是超時(shí)時(shí)間。
創(chuàng)建了timer后,就可以調(diào)用wait函數(shù)來阻塞等待至timer超時(shí)了,它還有一種可以指定錯(cuò)誤碼的入?yún)⒌闹剌d形式,關(guān)于錯(cuò)誤碼后面再介紹。
同步timer雖然簡單,但由于其會阻塞,在實(shí)際的項(xiàng)目中并不常用,而往往使用的是異步timer:指定一個(gè)回調(diào)函數(shù),計(jì)時(shí)器超時(shí)后執(zhí)行回調(diào)函數(shù)。asio中實(shí)現(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; }
和同步方式相比,它主要有兩點(diǎn)不同:
調(diào)用的是非阻塞函數(shù)async_wait,它的入?yún)⑹且粋€(gè)回調(diào)函數(shù)。
顯式調(diào)用io_service.run()函數(shù)驅(qū)動異步IO調(diào)度。
Timer還有一種常用操作是取消Timer,基本方法如下:
調(diào)用timer的cancel函數(shù)取消timer
timer取消后,回調(diào)函數(shù)會立即執(zhí)行,通過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; }
可以通過expires_from_now和expires_at兩個(gè)函數(shù)更改Timer的超時(shí)時(shí)間,如下示例就通過它實(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怎么使用”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。