c++定時器
阿新 • • 發佈:2018-05-31
異步操作 回調函數 epoll cal name async class a bind posix
io_service的任務執行流程:
調用run方法,進入主loop;
判斷公有隊列是否為空,不為空則取出任務並執行,當任務數大於1時同時喚醒其他空閑線程;
任務執行結束,把各個線程的私有隊裏面的任務移動到公有任務隊列裏面。
觸發reactor,linux下面一般是epoll,當有事件時,把相應的事件的任務放到私有隊列裏。
當隊列為空時,把當前線程加到空閑線程隊列裏面,同時進入wait狀態,等待其他線程的喚醒。
當用戶調用post時,任務是直接投遞到公有隊列裏面。
io_service.run():開始執行隊列中的所有任務,直到任務執行完畢。
同步定時器:
#include <boost/thread.hpp> #include <boost/asio.hpp> #include <boost/date_time/posix_time/posix_time.hpp> int main() { boost::asio::io_service ios; // 所有asio程序都必須要有一個io_service對象 boost::asio::deadline_timer t(ios, boost::posix_time::seconds(2)); // 定時器 std::cout << t.expires_at() << std::endl; // 查看定時器終止的絕對時間 t.wait(); // 同步等待 std::cout << "hello!" << std::endl; return 0; }
異步定時器:
#include <boost/thread.hpp> #include <boost/asio.hpp> #include <boost/date_time/posix_time/posix_time.hpp> // error_code表示程序運行的錯誤 void call_back(const boost::system::error_code& e) { std::cout << "I am call_back." << std::endl; } int main() { boost::asio::io_service ios; // 所有asio程序都必須要有一個io_service對象 boost::asio::deadline_timer t(ios, boost::posix_time::seconds(2)); // 定時器 t.async_wait(call_back); // 異步等待,傳入回調函數 std::cout << "我在定時器前面" << std::endl; ios.run(); // 等待異步操作完成,完成時io_service從操作系統獲取執行結果,調用完成處理函數 return 0; }
異步定時器使用bind
#include <boost/thread.hpp> #include <boost/asio.hpp> #include <boost/date_time/posix_time/posix_time.hpp> class a_timer { private: int count, count_max; boost::function<void()> f; // 無參無返回的可調用用 boost::asio::deadline_timer t; // 定時器 public: template<typename F> a_timer(boost::asio::io_service &ios, int x, F func) : f(func), count_max(x), count(0), t(ios, boost::posix_time::millisec(500)) { t.async_wait(boost::bind(&a_timer::call_func, this, _1)); // 註冊回調函數 } void call_func(const boost::system::error_code &e) { if (count > count_max) { return; } ++count; f(); t.expires_at(t.expires_at() + boost::posix_time::millisec(500)); t.async_wait(boost::bind(&a_timer::call_func, this, _1)); // 再次啟動定時器 } }; void print1() { std::cout << "hello print1." << std::endl; } void print2() { std::cout << "hello print2." << std::endl; } int main() { boost::asio::io_service ios; a_timer t1(ios, 5, print1); a_timer t2(ios, 5, print2); ios.run(); // 異步等待調用結束 return 0; }
c++定時器