亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

boost.asio框架系列之定時器Timer怎么使用

發布時間:2022-06-20 09:26:33 來源:億速云 閱讀:307 作者:iii 欄目:開發技術

這篇文章主要介紹“boost.asio框架系列之定時器Timer怎么使用”,在日常操作中,相信很多人在boost.asio框架系列之定時器Timer怎么使用問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”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操作都是基于它來執行的。然后創建了一個deadline_timer對象,它有兩個參數,一個是io_service對象,另一個是超時時間。

創建了timer后,就可以調用wait函數來阻塞等待至timer超時了,它還有一種可以指定錯誤碼的入參的重載形式,關于錯誤碼后面再介紹。

異步Timer

同步timer雖然簡單,但由于其會阻塞,在實際的項目中并不常用,而往往使用的是異步timer:指定一個回調函數,計時器超時后執行回調函數。asio中實現異步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;
    }

和同步方式相比,它主要有兩點不同:

  • 調用的是非阻塞函數async_wait,它的入參是一個回調函數。

  • 顯式調用io_service.run()函數驅動異步IO調度。

取消Timer

Timer還有一種常用操作是取消Timer,基本方法如下:

  • 調用timer的cancel函數取消timer

  • timer取消后,回調函數會立即執行,通過err_code可以感知到計時器是否已經被取消

    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兩個函數更改Timer的超時時間,如下示例就通過它實現一個周期計時器。

    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怎么使用”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

萨迦县| 陕西省| 静乐县| 开远市| 神农架林区| 双桥区| 曲阳县| 筠连县| 农安县| 什邡市| 青铜峡市| 大庆市| 贡觉县| 沧州市| 沾化县| 洞口县| 邓州市| 永州市| 永嘉县| 新泰市| 博兴县| 宁国市| 家居| 伊宁市| 丘北县| 咸丰县| 沧州市| 田阳县| 望奎县| 宝兴县| 黄浦区| 巴南区| 大石桥市| 绥阳县| 西乌珠穆沁旗| 阜南县| 工布江达县| 东兰县| 天水市| 确山县| 龙陵县|