溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

基于c++11中event-driven library的示例分析

發(fā)布時(shí)間:2021-08-23 10:20:52 來源:億速云 閱讀:93 作者:小新 欄目:編程語(yǔ)言

這篇文章主要介紹基于c++11中event-driven library的示例分析,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

做了一個(gè)不到200行的事件驅(qū)動(dòng)庫(kù),基于c++11標(biāo)準(zhǔn),header-only,跨平臺(tái)。支持自定義事件,通過wake_up函數(shù)異步喚醒。寫這個(gè)庫(kù)的動(dòng)機(jī)是想為之前自己寫的日志庫(kù)提供日志回滾機(jī)制。

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

event_pool

基本介紹

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

一個(gè)基于c++11標(biāo)準(zhǔn),僅需要頭文件的事件驅(qū)動(dòng)庫(kù):)。

使用方法:

創(chuàng)建event_pool對(duì)象并申請(qǐng)一個(gè)線程做事件處理,在該線程中調(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對(duì)象并設(shè)置id_,type_,回調(diào)函數(shù)func_,上下文args_(如果是time_handle則還要設(shè)置觸發(fā)時(shí)間)等,push進(jìn)event_pool對(duì)象。

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

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

使用指南:

  1. 所有對(duì)象均需使用std::shared_ptr創(chuàng)建。

  2. 每個(gè)time_handle對(duì)象和event_handle對(duì)象只能push進(jìn)一個(gè)event_pool對(duì)象。

  3. event_handle對(duì)象可設(shè)置兩種類型:every和once,every類型允許不限次數(shù)的wake_up,event_pool會(huì)處理每次wake_up,而once類型只能被喚醒一次,但允許多次調(diào)用wake_up函數(shù)(線程安全),這意味著可以在多個(gè)線程并發(fā)的觸發(fā)事件。

  4. time_handle對(duì)象可設(shè)置兩種類型:duration和time_point,其中duration類型通過設(shè)置duration_成員來指定從此刻開始,每間隔多少時(shí)間就觸發(fā)一次。time_point類型通過設(shè)置time_point_成員來指定在哪個(gè)時(shí)刻僅觸發(fā)一次。

  5. 回調(diào)函數(shù)的輸入?yún)?shù)就是該事件對(duì)象本身,你可以通過其訪問設(shè)置的id_,type_,args_等等。

  6. event_pool的run函數(shù)可以在多個(gè)線程并發(fā)執(zhí)行(maybe?),這一點(diǎn)暫且不保證。

特點(diǎn):

1.輕量級(jí),200行源代碼,語(yǔ)言層面的跨平臺(tái),基于c++11標(biāo)準(zhǔn)。

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

todo:

  • 定義更便于使用,減少出錯(cuò)概率的接口。

  • 補(bǔ)充測(cè)試。

以上是“基于c++11中event-driven library的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI