您的位置:首頁 > 教程 > C語言教程 > boost.asio框架系列之定時器Timer

boost.asio框架系列之定時器Timer

2022-06-18 17:53:41 來源:易采站長站 作者:

boost.asio框架系列之定時器Timer

同步Timer

asio中提供的timer名為deadline_timer,它提供了超時計時的功能。首先以一個最簡單的同步Timer為例來演示如何使用它。XBV站長之家-易采站長站-Easck.Com

    #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對象,另一個是超時時間。XBV站長之家-易采站長站-Easck.Com

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

異步Timer

同步timer雖然簡單,但由于其會阻塞,在實際的項目中并不常用,而往往使用的是異步timer:指定一個回調函數,計時器超時后執行回調函數。asio中實現異步timer比較簡單,示例如下:XBV站長之家-易采站長站-Easck.Com

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

和同步方式相比,它主要有兩點不同:XBV站長之家-易采站長站-Easck.Com

    調用的是非阻塞函數async_wait,它的入參是一個回調函數。XBV站長之家-易采站長站-Easck.Com

    顯式調用io_service.run()函數驅動異步IO調度。XBV站長之家-易采站長站-Easck.Com

    取消Timer

    Timer還有一種常用操作是取消Timer,基本方法如下:XBV站長之家-易采站長站-Easck.Com

      調用timer的cancel函數取消timerXBV站長之家-易采站長站-Easck.Com

      timer取消后,回調函數會立即執行,通過err_code可以感知到計時器是否已經被取消XBV站長之家-易采站長站-Easck.Com

          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的超時時間,如下示例就通過它實現一個周期計時器。XBV站長之家-易采站長站-Easck.Com

          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的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支持易采站長站。XBV站長之家-易采站長站-Easck.Com

      如有侵權,請聯系QQ:279390809 電話:15144810328

相關文章

  • VS2019項目打包生成.exe文件與Setup的步驟實現

    VS2019項目打包生成.exe文件與Setup的步驟實現

    對于Visual Studio Installer ,我們通常稱為:setup項目,是一個用于自定義安裝部署的項目方案。但是在VS2019中不見了,微軟是有意廢除安裝項目的,合作了一個第三方的安裝項目單獨使用。
    2020-03-13
  • 基于c++ ege圖形庫實現五子棋游戲

    基于c++ ege圖形庫實現五子棋游戲

    本文分享的五子棋實例,制作基于ege圖像庫, 首先需要安裝配置ege環境 就可以編寫小游戲了. 用到的ege庫函數不多 , 主要是基于c++的. 先看界面效果: 輸入界面:(就是控制臺) 游戲勝利界面
    2020-01-06
  • C++基于easyx圖形庫實現推箱子游戲

    C++基于easyx圖形庫實現推箱子游戲

    本文實例為大家分享了C++實現推箱子游戲的具體代碼,供大家參考,具體內容如下 頭文件: #includestdio.h#includestdlib.h//#includeWindows.h#includeconio.h#includegraphics.h#includestdbool.h //播放音樂需要
    2020-06-30
  • VS2019 Nuget找不到包的問題處理

    VS2019 Nuget找不到包的問題處理

    VS不記得改了什么設置之后,發現找不到EF 解決辦法 1、點擊右側的設置按鈕 2、彈出窗中左側樹形結構選擇“程序包源”,再點擊右上方的添加按鈕 輸入一下信息:https://www.nuget.org/a
    2020-03-27
  • visual studio2019的安裝以及使用圖文步驟詳解

    visual studio2019的安裝以及使用圖文步驟詳解

    一、下載安裝包 下載地址 選擇visual studio 2019的community版本 二、下載好后運行 三、組件的選擇 如果是用來學CC++的話,選擇以下兩個就夠了 之后如果還需要其他一些功能的話,可以后
    2020-03-08
  • VScode編譯C++ 頭文件顯示not found的問題

    VScode編譯C++ 頭文件顯示not found的問題

    一直用codeblocks,想試試vscode,結果這個問題給我弄懵逼了。一開始以為是iostream這個頭文件not found,后來發現第一個頭文件都會這樣顯示,放到后面就不會了,然而,光這一個顯示not
    2020-03-20
  • C++多線程獲取返回值方法詳解

    C++多線程獲取返回值方法詳解

    在許多時候,我們會有這樣的需求——即我們想要得到線程返回的值。但是在C++11 多線程中我們注意到,std::thread對象會忽略頂層函數的返回值。 那問題來了,我們要怎么獲得線程的返
    2020-06-25
  • JVM系列之String.intern的性能解析

    JVM系列之String.intern的性能解析

    String對象有個特殊的StringTable字符串常量池,為了減少Heap中生成的字符串的數量,推薦盡量直接使用String Table中的字符串常量池中的元素。 那么String.intern的性能怎么樣呢?我們一起來
    2020-06-23
色七七影院_香港三级台湾三级在线播放_男人放进女人阳道猛进猛出