最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于c++11的event-driven library的理解

 更新時間:2020年02月12日 16:00:52   作者:p__n  
這篇文章主要介紹了基于c++11的event-driven library的理解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

做了一個不到200行的事件驅(qū)動庫,基于c++11標準,header-only,跨平臺。支持自定義事件,通過wake_up函數(shù)異步喚醒。寫這個庫的動機是想為之前自己寫的日志庫提供日志回滾機制。

github:https://github.com/chloro-pn/event_pool

event_pool

基本介紹

a header-only event-driven library based on c++11.

一個基于c++11標準,僅需要頭文件的事件驅(qū)動庫:)。

使用方法:

創(chuàng)建event_pool對象并申請一個線程做事件處理,在該線程中調(diào)用run函數(shù)。

  //run the event_pool.
  std::shared_ptr<event_pool> ev(new event_pool());
  std::thread th([=]()->void {
    ev->run();
  });

創(chuàng)建event_handle和time_handle對象并設置id_,type_,回調(diào)函數(shù)func_,上下文args_(如果是time_handle則還要設置觸發(fā)時間)等,push進event_pool對象。

  //create time_handle.
  std::shared_ptr<time_handle> h(new time_handle());
  h->id_ = "timer test ";
  h->type_ = time_handle::type::duration;
  h->duration_ = seconds(2);
  h->args_ = nullptr;
  h->func_ = [](std::shared_ptr<time_handle> self)->void {
      std::cout << self->id_ << " wake up !" << std::endl;
  };
  //create event_handle.
  std::shared_ptr<event_handle> eh(new event_handle());
  eh->id_ = "back cout ";
  eh->type_ = event_handle::type::every;
  eh->args_ = nullptr;
  eh->func_ = [](std::shared_ptr<event_handle> self)->void {
    std::cout << self->id_ << " wake up !"<<std::endl;
  };
  //push them into ev.
  ev->push_timer(h);
  ev->push_event(eh);

在需要觸發(fā)事件的時候調(diào)用wake_up函數(shù)(time_handle沒有wake_up函數(shù),等待時間到達自動觸發(fā))。當需要關(guān)閉event_pool時,調(diào)用stop函數(shù),然后回收線程,沒有來得及處理的事件會被丟棄,即使當event_pool 對象完全銷毀后,仍然可以調(diào)用wake_up函數(shù),此時會直接返回。

   while (true) {
    char buf[1024];
    gets(buf);
    if (buf[0] == 'q') {
     ev->stop(); // stop the event_pool.
     break;
    }
    eh->wake_up();
   }
   th.join();

使用指南:

  1. 所有對象均需使用std::shared_ptr創(chuàng)建。
  2. 每個time_handle對象和event_handle對象只能push進一個event_pool對象。
  3. event_handle對象可設置兩種類型:every和once,every類型允許不限次數(shù)的wake_up,event_pool會處理每次wake_up,而once類型只能被喚醒一次,但允許多次調(diào)用wake_up函數(shù)(線程安全),這意味著可以在多個線程并發(fā)的觸發(fā)事件。
  4. time_handle對象可設置兩種類型:duration和time_point,其中duration類型通過設置duration_成員來指定從此刻開始,每間隔多少時間就觸發(fā)一次。time_point類型通過設置time_point_成員來指定在哪個時刻僅觸發(fā)一次。
  5. 回調(diào)函數(shù)的輸入?yún)?shù)就是該事件對象本身,你可以通過其訪問設置的id_,type_,args_等等。
  6. event_pool的run函數(shù)可以在多個線程并發(fā)執(zhí)行(maybe?),這一點暫且不保證。

特點:

1.輕量級,200行源代碼,語言層面的跨平臺,基于c++11標準。

2.僅需要頭文件,即拿即用。

todo:

  • 定義更便于使用,減少出錯概率的接口。
  • 補充測試。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論

波密县| 囊谦县| 乐清市| 汝南县| 沈丘县| 灵宝市| 沁阳市| 历史| 墨竹工卡县| 兰考县| 东乌珠穆沁旗| 丹阳市| 历史| 扶绥县| 嫩江县| 万荣县| 宣恩县| 梨树县| 婺源县| 曲阜市| 安国市| 铁岭市| 通许县| 观塘区| 安远县| 安宁市| 无极县| 兰西县| 扎兰屯市| 东乌| 金川县| 永济市| 黔西县| 金沙县| 张北县| 抚顺县| 铁岭县| 中卫市| 柞水县| 富源县| 洛川县|