基于c++11的event-driven library的理解
做了一個不到200行的事件驅(qū)動庫,基于c++11標(biāo)準(zhǔn),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標(biāo)準(zhǔn),僅需要頭文件的事件驅(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對象并設(shè)置id_,type_,回調(diào)函數(shù)func_,上下文args_(如果是time_handle則還要設(shè)置觸發(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ā))。當(dāng)需要關(guān)閉event_pool時,調(diào)用stop函數(shù),然后回收線程,沒有來得及處理的事件會被丟棄,即使當(dāng)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();
使用指南:
- 所有對象均需使用std::shared_ptr創(chuàng)建。
- 每個time_handle對象和event_handle對象只能push進一個event_pool對象。
- event_handle對象可設(shè)置兩種類型:every和once,every類型允許不限次數(shù)的wake_up,event_pool會處理每次wake_up,而once類型只能被喚醒一次,但允許多次調(diào)用wake_up函數(shù)(線程安全),這意味著可以在多個線程并發(fā)的觸發(fā)事件。
- time_handle對象可設(shè)置兩種類型:duration和time_point,其中duration類型通過設(shè)置duration_成員來指定從此刻開始,每間隔多少時間就觸發(fā)一次。time_point類型通過設(shè)置time_point_成員來指定在哪個時刻僅觸發(fā)一次。
- 回調(diào)函數(shù)的輸入?yún)?shù)就是該事件對象本身,你可以通過其訪問設(shè)置的id_,type_,args_等等。
- event_pool的run函數(shù)可以在多個線程并發(fā)執(zhí)行(maybe?),這一點暫且不保證。
特點:
1.輕量級,200行源代碼,語言層面的跨平臺,基于c++11標(biāo)準(zhǔn)。
2.僅需要頭文件,即拿即用。
todo:
- 定義更便于使用,減少出錯概率的接口。
- 補充測試。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
詳解C語言編程中的函數(shù)指針以及函數(shù)回調(diào)
這篇文章主要介紹了C語言編程中的函數(shù)指針以及函數(shù)回調(diào),函數(shù)回調(diào)實際上就是讓函數(shù)指針作函數(shù)參數(shù)、調(diào)用時傳入函數(shù)地址,需要的朋友可以參考下2016-04-04C++中CString string char* char 之間的字符轉(zhuǎn)換(多種方法)
在寫程序的時候,我們經(jīng)常遇到各種各樣的類型轉(zhuǎn)換,比如 char* CString string 之間的互相轉(zhuǎn)換,這里簡單為大家介紹一下,需要的朋友可以參考下2017-09-09C語言庫函數(shù)strcpy的使用及模擬實現(xiàn)
本文主要介紹了C語言庫函數(shù)strcpy的使用及模擬實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-04-04C++基于QWidget和QLabel實現(xiàn)圖片縮放,拉伸與拖拽
這篇文章主要為大家詳細介紹了C++如何基于QWidget和QLabel實現(xiàn)圖片縮放、拉伸與拖拽等功能,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-02-02