boost庫在工作(24)任務之四

2021-06-16 15:03:18 字數 1450 閱讀 4906

在軟體開發裡,經常會遇到這樣的情況,比如客戶讓我們開發的軟體要求每隔半小時,就要備份一次資料,以便避免資料丟失。又比如在開發乙個遊戲網路伺服器時,需要不斷檢查客戶端連線上來的資料連線是否還有效,這時也需要使用乙個任務來檢查客戶端的連線是否還有心跳包過來,如果沒有心跳包,就可以把這個連線斷開,釋放相關的資源,避免伺服器的資源永遠占用,導致伺服器執行時間長了就會宕機。面對這些情況,在有介面的情況下,往往通過介面上的定時器來提供定時服務來解決這些問題。在沒有介面的情況之下,往往使用乙個執行緒來解決,雖然都可以解決,但相比boost庫里的boost::asio::deadline_timer物件來解決,顯示有點複雜,**有點多,維護性也不好。下面就來看例子,怎麼樣簡單優美地解決心跳包檢查的問題:

//#include "stdafx.h"

#include #include #include #include #include #include void taskrun(int nval)

//封裝執行緒組執行的類, 並且演示使用類成員函式作為執行緒組執行函式

class cthreadbase

void start(int nmaxcount) }

void stop(void)

//測試任務佇列

void testtask(void)

private:

virtual void run(int nval)

//void wait(int nseconds)

private:

//定義乙個任務佇列。

boost::asio::io_service m_ioservice;

boost::asio::io_service::work m_work;

//定義乙個執行緒組物件。

boost::thread_group m_threadgroup;

//建立定時器。

boost::asio::deadline_timer m_heartbeat;

};int _tmain(int argc, _tchar* argv)

在這個例子裡,定義了定時器boost::asio::deadline_timer物件heartbeat,然後呼叫函式expires_from_now來設定定時的時間,最後呼叫函式async_wait非同步呼叫函式wait來執行。為了達到每間隔5秒呼叫一次,在函式wait裡遞迴地呼叫函式expires_from_now和函式async_wait。因此在這個例子裡,函式wait就是定時執行的函式,在這個函式新增**,就可以實現定時地檢查心跳包,定時備份的工作。這個例子輸出的結果如下:

taskrun: 1

taskrun: 2

taskrun: 3

taskrun: 4

taskrun: 5

wait: 5

taskrun: 6

wait: 5

wait: 5

wait: 5

請按任意鍵繼續. . .

boost庫在工作(25)任務之五

include stdafx.h include include include include include include void taskrun int nval 封裝執行緒組執行的類,並且演示使用類成員函式作為執行緒組執行函式 class cthreadbase void start i...

boost庫在工作(21)任務之一

boost 庫里提供了乙個強大的任務佇列,這個佇列可以使用執行緒池訪問,也可以當任務為空時阻塞執行緒。使用這個任務佇列,可以讓多個任務動態執行,以及適應不同的情況,可以得心應手。在 windows 系統上實現是採用 iocp 的原理來實現,因此這個任務佇列不但可以執行一般的任務,也適用於網路應用方面...

boost庫在工作(22)任務之二

往往我們開發出來的產品,都是執行在不同的國家,不同的地區,不同生活水平的使用者,因而軟體產品會執行在不同的環境的電腦裡。比如富裕國家裡的電腦硬體資源,都比較好,如果還是按低配置電腦的水平設計,顯示不會滿足使用者的要求。但是按高配置要求的硬體資源來設計,行嗎?也不行,比如軟體安裝到工廠這樣節約資源的電...