VCF delegate执行过程简单说明

来源:互联网 发布:星际争霸2 for mac 编辑:程序博客网 时间:2024/06/05 02:07

 

原创文章转载请注明出处

 

说明:说的比较粗...以后有时间会逐渐把VCF里面的知识点全部一一道出.

 

 

 

以配置文件读取为例:

 

delegate读取过程

1:从文件读到delegates的信息,并保存起来

 

其中:

callbackIds等于委托的对象名和委托的地址,:AcfWindow@AcfWindow::click

delegateName为委托名,代表是什么事件,比如ButtonClick

source即是源.

 

循环每一个委托

 根据对象名找到此对象的地址.如果没有找到,就到上一层去找.

这里面的rootComponent_是在abstractapplication里面注册的.所以最上面一层是application,最上层也没有的话.查找失败.

2:将文件配置的委托信息,进行注册

 

 

 

由于上面找到了对象地址.现在开始查找对象里面的函数地址.如果找到则add到自己的Delegate里面去

 

 

 

 

 注意:

函数( callback)可以被许多个委托所拥有.

委托(delegate)也可以同时委托很多函数( callback)保存在functions.

在add的过程中会有这样的代码.

 

 

 

 delegate注册过程.

上面提到查找类,查找函数,既然要被查找到.首先得有一个注册的过程.

注册类就是RTTI相关宏.

注册函数:要在callback集合中添加这个函数,这里使用addCallback函数来完成

 

 

 

 首先生成一个callback,用来管理执行函数,接着就把这个callback添加到自己的callback_集合中去.

 

 

 

 这里的callback_将在上面的delegate查找函数地址的时候会用到.

 

至此,我们的delegatecallback都添加好了

摘抄了点日志:

---- callbacks_ = 0x498520  add callback name onClose
---- Delegate add callback.source = 0x498520, name onClose
---- callbacks_ = 0x498520  add callback name Frame::handleEvent
---- Delegate add callback.source = 0x498520, name Frame::handleEvent
---- callbacks_ = 0x498520  add callback name dosth
---- Delegate add callback.source = 0x498520, name dosth
---- callbacks_ = 0x498520  add callback name AcfWindow::click
---- callbacks_ = 0x49a4f0  add callback name AbstractWin32Component::onControlFontChanged
---- Delegate add callback.source = 0x49a4f0, name AbstractWin32Component::onControlFontChanged
---- callbacks_ = 0x49a850  add callback name CommandButton::onFocusGained
---- Delegate add callback.source = 0x49a850, name CommandButton::onFocusGained
---- callbacks_ = 0x49a850  add callback name CommandButton::onFocusLost
---- Delegate add callback.source = 0x49a850, name CommandButton::onFocusLost

验证一下 dosthcallbackdelegate.看到了一致性了吧

 

 

 

delegate执行过程:

以click事件为例,我们首先到事件的发送地方去

 

 

  

 

 

发现了commandbutton->ckick();再往里面看

 

首先构造一个event包含自己的this,当做参数执行Buttonclicked

Buttonclicked 的来历是这样的.

DELEGATE(ButtonDelegate,ButtonClicked);

这个宏展开后有一句是ButtonDelegate ButtonClicked;

说明ButtonClicked是一个delegate.

由于delegate重载了operator().所以就直接执行到了delegateinvoke.event则是参数.

 

 

 

 

下面是执行代码:

 

其中getcallback里面的functions就是delegate保存的callback列表

 

 

 

 

 

 

 

 

以上是从配置档里面分析delegate的执行过程.

 

 

原创粉丝点击