1. 程式人生 > >boost定時器使用

boost定時器使用



2. 同步Timer

本章介紹asio如何在定時器上進行阻塞等待(blocking wait). 
實現,我們包含必要的標頭檔案. 
所有的asio類可以簡單的通過include "asio.hpp"來呼叫.
  1. #include <iostream>
  2. #include <boost/asio.hpp>
此外,這個示例用到了timer,我們還要包含Boost.Date_Time的標頭檔案來控制時間.
  1. #include <boost/date_time/posix_time/posix_time.hpp>
使用asio至少需要一個boost::asio::io_service物件.該類提供了訪問I/O的功能.我們首先在main函式中宣告它.
  1. int main()
  2. {
  3.     boost::asio::io_service io;
下一步我們宣告boost::asio::deadline_timer物件.這個asio的核心類提供I/O的功能(這裡更確切的說是定時功能),總是把一個io_service物件作為他的第一個建構函式,而第二個建構函式的引數設定timer會在5秒後到時(expired).
  1. boost::asio::deadline_timer t(io, boost::posix_time::seconds(5));
這個簡單的示例中我們演示了定時器上的一個阻塞等待.就是說,呼叫boost::asio::deadline_timer::wait()的在建立後5秒內(注意:不是等待開始後),timer到時之前不會返回任何值. 
一個deadline_timer只有兩種狀態:到時,未到時
如果boost::asio::deadline_timer::wait()在到時的timer物件上呼叫,會立即return.
  1. t.wait();
最後,我們輸出理所當然的"Hello, world!"來演示timer到時了.
  1.     std::cout << 
    "Hello, world! ";
  2. return 0;
  3. }

完整的程式碼:

  1. #include <iostream>
  2. #include <boost/asio.hpp>
  3. #include <boost/date_time/posix_time/posix_time.hpp>
  4. int main()
  5. {
  6.     boost::asio::io_service io;
  7.     boost::asio::deadline_timer t(io, boost::posix_time::seconds(5));
  8.     t.wait();
  9.     std::cout << "Hello, world! ";
  10. return 0;
  11. }

3. 非同步Timer

  1. #include <iostream>
  2. #include <asio.hpp>
  3. #include <boost/date_time/posix_time/posix_time.hpp>
asio的非同步函式會在一個非同步操作完成後被回撥.這裡我們定義了一個將被回撥的函式.
  1. void print(const asio::error& /*e*/)
  2. {
  3.     std::cout << "Hello, world! ";
  4. }
  5. int main()
  6. {
  7.     asio::io_service io;
  8.     asio::deadline_timer t(io, boost::posix_time::seconds(5));
這裡我們呼叫asio::deadline_timer::async_wait()來非同步等待
  1. t.async_wait(print);
最後,我們必須呼叫asio::io_service::run()
asio庫只會呼叫那個正在執行的asio::io_service::run()的回撥函式. 
如果asio::io_service::run()不被呼叫,那麼回撥永遠不會發生. 
asio::io_service::run()會持續工作到點,這裡就是timer到時,回撥完成. 
別忘了在呼叫 asio::io_service::run()之前設定好io_service的任務.比如,這裡,如果我們忘記先呼叫asio::deadline_timer::async_wait()asio::io_service::run()會在瞬間return.
  1.     io.run();
  2. return 0;
  3. }

完整的程式碼:

  1. #include <iostream>
  2. #include <asio.hpp>
  3. #include <boost/date_time/posix_time/posix_time.hpp>
  4. void print(const asio::error& /*e*/)
  5. {
  6.     std::cout << "Hello, world! ";
  7. }
  8. int main()
  9. {
  10.     asio::io_service io;
  11.     asio::deadline_timer t(io, boost::posix_time::seconds(5));
  12.     t.async_wait(print);
  13.     io.run();
  14. return 0;
  15. }

4. 回撥函式的引數

這裡我們將每秒回撥一次,來演示如何回撥函式引數的含義
  1. #include <iostream>
  2. #include <asio.hpp>
  3. #include <boost/bind.hpp>
  4. #include <boost/date_time/posix_time/posix_time.hpp>
首先,調整一下timer的持續時間,開始一個非同步等待.顯示,回撥函式需要訪問timer來實現週期執行,所以我們再介紹兩個新引數
  • 指向timer的指標
  • 一個int*來指向計數器
  1. void print(const asio::error& /*e*/,
  2.     asio::deadline_timer* t, int* count)
  3. {
我們打算讓這個函式執行6個週期,然而你會發現這裡沒有顯式的方法來終止io_service.不過,回顧上一節,你會發現當 asio::io_service::run()會在所有任務完成時終止.這樣我們當計算器的值達到5時(0為第一次執行的值),不再開啟一個新的非同步等待就可以了.
  1. if (*count < 5)
  2.     {
  3.         std::cout << *count << " ";
  4.         ++(*count);
  5. ...
然後,我們推遲的timer的終止時間.通過在原先的終止時間上增加延時,我們可以確保timer不會在處理回撥函式所需時間內的到期. 
(原文:By calculating the new expiry time relative to the old, we can ensure that the timer does not drift away from the whole-second mark due to any delays in processing the handler.)
  1. t->expires_at(t->expires_at() + boost::posix_time::seconds(1));
然後我們開始一個新的同步等待.如您所見,我們用把print和他的多個引數用boost::bind函式合成一個的形為void(const asio::error&)回撥函式(準確的說是function object). 
在這個例子中, boost::bindasio::placeholders::error引數是為了給回撥函式傳入一個error物件.當進行一個非同步操作,開始 boost::bind時,你需要使用它來匹配回撥函式的引數表.下一節中你會學到回撥函式不需要error引數時可以省略它.
  1.      t->async_wait(boost::bind(print,
  2.         asio::placeholders::error, t, count));
  3.     }
  4. }
  5. int main()
  6. {
  7.     asio::io_service io;
  8. int count = 0;
  9.     asio::deadline_timer t(io, boost::posix_time::seconds(1));
和上面一樣,我們再一次使用了繫結asio::deadline_timer::async_wait()
  1. t.async_wait(boost::bind(print,
  2.     asio::placeholders::error, &t, &count));
  3. io.run();
在結尾,我們打印出的最後一次沒有設定timer的呼叫的count的值
  1.     std::cout << "Final count is " << count << " ";
  2. return 0;
  3. }

完整的程式碼:

  1. 相關推薦

    boost定時使用

    2. 同步Timer 本章介紹asio如何在定時器上進行阻塞等待(blocking wait).  實現,我們包含必要的標頭檔案.  所有的asio類可以簡單的通過include "asio.hpp"來呼叫. #include <

    boost 定時.

    先參考這個: 最簡單的使用 #include <iostream> #include <boost/asio.hpp> int main() { boost::asio::io_service

    概念理解:boost::asio::定時2

      多執行緒同步回撥#include <cstdio> #include <iostream> #include <boost/asio.hpp> #include <boost/thread.hpp> #include <boost/

    Boost中ASIO的一些用法-定時

    一、介紹 ASIO,基於作業系統的非同步機制,可有效避免多執行緒程式設計的諸多副作用。 目前主要關注於通訊方面,使用大量的類封裝了socket,提供更高層次的介面 二、使用不需要編譯,預設不支援SSL,要支援的話需要自己編譯OpenSSL。 三、用法Sample 1、

    C++ Boost庫 asio同步/非同步模式[ 定時來體現 ] 筆記

    此文轉自:http://blog.csdn.net/misskissC/article/details/9963515 1.機制分析 asio封裝了作業系統的select、poll/epoll、kqueue、overlapped I/O眾多機制,實現了非同步I/O模

    boost asio timer 定時

    前提條件安裝好boost1.68  其他版本的函式可能有變動 main.cpp #include <iostream> #include <boost/asio.hpp> int main() { // 每個程序都至少有一個io_cont

    boost::asio名字空間中的deadline_time類:定時

    定時器是asio庫中最簡單的一個IO模型,提供等候時間終止的功能。 定時器功能的主要類是:deadline_timer類,類摘要如下 使用定時器時的標頭檔案: #include <boost/asio.hpp> #include &

    boost的asio+deadline_timer實現一個迴圈定時

    廢話不多說, asio的原理請百度其它博文, 百度上好多deadline_timer的例子都是單次定時, 或者是封裝的很長. 本文寫的是一個超簡單的例子來實現迴圈定時, 注意這個迴圈的週期是可變的, 可以每5秒固定週期執行, 也可以1秒/5秒/2秒變週期執行, 或者指定一個絕

    boost.Asio Example定時的思考---結果阻礙了我們對本質的思考

    boost.Asio官網給的教程很多關於定時器的例子,現在我就來研究下這幾個例子 Example 1: // // timer.cpp // ~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Koh

    js---08函數 定時

    utf 返回值 right mouseout clear time play nts length <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" con

    JS定時

    ++ 清除 bsp interval rom 變量 數值 get () js清除定時器的方法 在需要有實時性更新數據的項目中,我們經常會用到很多定時器,我們可能需要一個可以一次性清除所有定時器的方法,並且不通過指定ID一個一個去清除,以下提供兩種解決方案

    真是奇怪,js可以,jq卻開啟了多個定時,誰能解答一下

    eve body stop 時鐘 time 就會 set () 方式 timer = setInterval(mar,30); //鼠標移上去清除時鐘 box.onmouseover = function(event){

    golang的定時簡單使用

    func new sta tick package 定時 golang rtti fmt ticker.go package main import (   "time"   "fmt" ) func main() {   StartTimer() } func Start

    js精準時間叠代定時

    tof fse 器) val 時間 ext start clas local window.setMyInterval = function(func, interval){ var nexttime = interval; var start

    js 定時用法詳解——setTimeout()、setInterval()、clearTimeout()、clearInterval()

    ntb 幫助 .get tint num 用法 -c 函數 tel 在js應用中,定時器的作用就是可以設定當到達一個時間來執行一個函數,或者每隔幾秒重復執行某段函數。這裏面涉及到了三個函數方法:setInterval()、setTimeout()、clearI

    定時/計數器0之定時

    .com 函數調用 wid 延時 mod main images .cn cnblogs /* 效果說明: 定時器中斷:通過單片機計數使程序執行 一秒中斷一次,中斷發生時高四位亮一秒,中斷發生後又回到主程序 */ #include <

    定時與TATE應用

    pre reg .cn err 開始 main 定時 .com spa 1 #include <reg51.h> 2 #include <stdio.h> 3 #define uchar unsigned char 4 sbit le

    自己定義定時(Timer)

    mil 動態 初始化 span 標誌位 定時器 ace ram run 近期做項目的時候,用到了java.util.Timer定時器類。也初步使用了,個人感覺不錯。只是,在某些方面Timer類無法滿足項目的需求。比方,在使用Timer時,調用schedule()方

    MySQL5-函數/存儲過程與定時、觸發器

    名稱 狀態 訪問 safe 安全問題 ant comm gnu led 目錄 一、函數/存儲過程 二、定時器 三、觸發器 四、函數語句學習 一、函數/存儲過程 1、函數與存儲過程 (1) function與procedure的區別:一個有返回值,一個沒有,僅此而已。

    定時quartz工具類

    color mem blog ace rtc dfa identity stop names 一、gradle配置   // https://mvnrepository.com/artifact/org.quartz-scheduler/quartz compil