码迷,mamicode.com
首页 > 其他好文 > 详细

聊聊filezilla 3.7.2 事件处理机制

时间:2021-06-23 16:26:25      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:如何   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 如何执行的。

 

聊聊filezilla 3.7.2 事件处理机制

标签:如何   send   ace   hello   ring   file   out   eve   div   

原文地址:https://www.cnblogs.com/haovcf/p/14920016.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!