Boost boost庫中timer定時器 1

2022-06-10 09:00:10 字數 2590 閱讀 8823

部落格**自:

同步timer

asio中提供的timer名為deadline_timer,它提供了超時計時的功能。首先以乙個最簡單的同步timer為例來演示如何使用它。

#include #include 

intmain()

首先常見了乙個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*/

)int

main()

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

呼叫的是非阻塞函式async_wait,它的入參是乙個**函式。

顯式呼叫io_service.run()函式驅動非同步io排程。

取消timer

void print(const boost::system::error_code&err)

std::cout

<< "

hello, world!\n";

}intmain()

更改timer超時時間

可以通過expires_from_now和expires_at兩個函式更改timer的超時時間,如下示例就通過它實現乙個週期計時器。

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

呼叫timer的cancel函式取消timer

timer取消後,**函式會立即執行,通過err_code可以感知到計時器是否已經被取消

typedef std::functiontimer_callback ;

void print(const boost::system::error_code&)

intmain()

;timer.async_wait(callback);

io.run();

return0;

}

#include #include 

#include

#include

class

printer

~printer()

void

print()

} private

: boost::asio::deadline_timer timer_;

intcount_;

};

intmain()

#include #include 

#include

#include

#include

#include

using

namespace

std;

//超時控制器類

class

timercontroller

/**

* 析構函式

*/

~timercontroller()

/**

* 定時器響應函式

* @param error_code 定時器異常錯誤資訊

*/void ontime(const boost::system::error_code&)

private

: unsigned

int m_uiwaitsec; //

定時間間隔等待時間

boost::asio::deadline_timer m_timer; //

asio定時器

boost::function m_timeouthandle; //

超時處理**函式

};

//建構函式

class

cmdqueuemanager

void

sendprocess()

timercontroller *m_ptimer;

};

intmain()

最近做專案時,做了乙個定時器,發現定時器**函式不按照指定時間**,總是延遲,後經研究發現,是io出了問題,把乙個io繫結到多個socket上面,並把這個io繫結到定時器上面,有一些socket連線網路時發出了一些connect行為,這些行為會造成io阻塞,當然這只是猜測,看到的讀者可以幫忙講解一下。所以本人建議做timer時候,自建乙個人「乾淨」的io。

Boost boost庫中sleep方法詳解

原型 cpp view plain copy print?void sleep timeduration const rel time void sleep system time const abs time 例項 cpp view plain copy print?boost this thre...

Boost boost庫中bind的用法

標頭檔案 boost bind.hpp bind 是一組過載的函式模板.用來向乙個函式 或函式物件 繫結某些引數.bind的返回值是乙個函式物件.它的原始檔太長了.看不下去.這裡只記下它的用法 9.1 對於普通函式 假如有函式 fun 如下 void fun int x,int y 現在我們看看怎麼...

Boost boost庫的隨機數的例子

void test mt19937 void test rand48 uniform smallint 在小整數域內的均勻分布 uniform int 在整數域上的均勻分布 uniform 01 在區間 0,1 上的實數連續均勻分布 uniform real 在區間 min,max 上的實數連續均勻...