标签:如何 send ace hello ring file out eve div
filezilla 3.7.2 处理事件依赖于一个自己封装的事件处理器。名字叫event_loop类。 这个类在libfillezilla工程种。作为filezilla的一个动态库。因为这个处理器对于filezilla十分重要。所以借此机会学习以下。
event_loop 头文件在 libfilezilla工程目录\lib\libfilezilla\event_loop.hpp。 cpp在 libfilezilla\lib\event_loop.cpp。和event_loop关系密切的一个类是event_handler。位置与event_loop相同。 这个类是对event_loop的一个薄层封装。
event_loop 支持两种,一种是事件类(event)的。另外一种是时间类(timer)的。
对于怎么使用 event_loop,libfillezilla中有对应的例子。代码中也有简洁的类。以libfilezilla工程 demo_events 为例。demo_events工程 只有一个叫 events.cpp 的文件。代码十分简单。如下
1 // Define a new event. 2 // The event is uniquely identified via the incomplete my_event_type struct and 3 // has two arguments: A string and a vector of ints. 4 struct my_event_type; 5 typedef fz::simple_event<my_event_type, std::string, std::vector<int>> my_event; 6 7 // A simple event handler 8 class handler final : public fz::event_handler 9 { 10 public: 11 handler(fz::event_loop& l) 12 : fz::event_handler(l) 13 {} 14 15 virtual ~handler() 16 { 17 // This _MUST_ be called to avoid a race so that operator()(fz::event_base const&) is not called on a partially destructed object. 18 remove_handler(); 19 } 20 21 private: 22 // The event loop calls this function for every event sent to this handler. 23 virtual void operator()(fz::event_base const& ev) 24 { 25 // Dispatch the event to the correct function. 26 fz::dispatch<my_event>(ev, this, &handler::on_my_event); 27 } 28 29 void on_my_event(std::string const& s, std::vector<int> const& v) 30 { 31 std::cout << "Received event with text \"" << s << "\" and a vector with " << v.size() << " elements" << std::endl; 32 33 // Signal the condition 34 fz::scoped_lock lock(m); 35 c.signal(lock); 36 } 37 };
可以看出,要使用event_loop类,需要实现自己的 event_handler类函数。在自己的event_handler类中需要做以下几件事。
1 定义构造 析构函数
2 定义自己 simple_event 的数据类型 以及这种数据类型的处理函数。
3 定义自己仿函数(或者叫()重载运算符)。
调用也很简单,代码如下。
1 // Start an event loop 2 fz::event_loop l; 3 4 // Create a handler 5 handler h(l); 6 7 // Send an event to the handler 8 h.send_event<my_event>("Hello World!", std::vector<int>{23, 42, 666}); 9 10 // Wait until a signal from the worker thread 11 fz::scoped_lock lock(m); 12 c.wait(lock);
定义 fz::event_loop 类实例,用这个实例构造 handler 实例。调用 handler 的send_event函数函数。
此处省略100字,明天分析 event_loop 如何执行的。
标签:如何 send ace hello ring file out eve div
原文地址:https://www.cnblogs.com/haovcf/p/14920016.html