亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

boost.asio框架系列之定時(shí)器Timer

 更新時(shí)間:2022年06月18日 15:25:07   作者:天方  
這篇文章介紹了boost.asio框架系列之定時(shí)器Timer,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

同步Timer

asio中提供的timer名為deadline_timer,它提供了超時(shí)計(jì)時(shí)的功能。首先以一個(gè)最簡(jiǎn)單的同步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對(duì)象,它提供了IO調(diào)度功能,asio庫(kù)中的所有io操作都是基于它來執(zhí)行的。然后創(chuàng)建了一個(gè)deadline_timer對(duì)象,它有兩個(gè)參數(shù),一個(gè)是io_service對(duì)象,另一個(gè)是超時(shí)時(shí)間。

創(chuàng)建了timer后,就可以調(diào)用wait函數(shù)來阻塞等待至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í)行,通過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í)間 

可以通過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的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論