<menu id="w8yyk"><menu id="w8yyk"></menu></menu>
  • <dd id="w8yyk"><nav id="w8yyk"></nav></dd>
    <menu id="w8yyk"></menu>
    <menu id="w8yyk"><code id="w8yyk"></code></menu>
    <menu id="w8yyk"></menu>
    <xmp id="w8yyk">
    <xmp id="w8yyk"><nav id="w8yyk"></nav>
  • 網站首頁 > 物聯資訊 > 技術分享

    boost.asio系列――Timer

    2016-09-28 00:00:00 廣州睿豐德信息科技有限公司 閱讀
    睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接

    同步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;
        }

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

    1. 調用的是非阻塞函數async_wait,它的入參是一個回調函數。
    2. 顯式調用io_service.run()函數驅動異步IO調度。

     

    取消Timer

     

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

    1. 調用timer的cancel函數取消timer
    2. 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;
        }

    PS:為了簡單,這兒用到了c++11的語法,不想用c++11語法可以參考boost文檔的原始示例

    RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成
    最近免费观看高清韩国日本大全