c++定時器

來源:互聯網
上載者:User

標籤:fun   cpp   ons   back   std   main   cal   結果   count   

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++定時器

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.