这样做有何优点?

4 views
Skip to first unread message

vivian huang

unread,
Feb 3, 2010, 4:24:34 AM2/3/10
to SHLUG
1. 用一个list 记录所有callback_func 的指针
2. 每个callback_func 能处理多种event,event 是参数,枚举值
3. 当需要触发某event 时候,只要调用cb_invoke(event, user_data),那么在list 上的所有callback_func 就都会被foreach(...) 轮遍调用。

yaoshi lee

unread,
Feb 3, 2010, 4:28:04 AM2/3/10
to sh...@googlegroups.com

vivian huang

unread,
Feb 3, 2010, 4:31:44 AM2/3/10
to sh...@googlegroups.com
runtime?

直接在调用cb_invoke 的地方调用event 对应的处理函数会更慢吗?
或者可以将多个callback_func 合并成一个,就不需要list了。

2010/2/3 yaoshi lee <liya...@gmail.com>

机械唯物主义 : linjunhalida

unread,
Feb 3, 2010, 4:32:08 AM2/3/10
to sh...@googlegroups.com
没头没尾的,不知道什么意思?

2010/2/3 yaoshi lee <liya...@gmail.com>:

机械唯物主义 : linjunhalida

unread,
Feb 3, 2010, 4:35:22 AM2/3/10
to sh...@googlegroups.com
什么程序?什么需求?
分析这样数据结构,要看怎么用,输入是什么。
比如list是否经常修改?每个function是否经常修改?

2010/2/3 vivian huang <vivia...@gmail.com>:

yaoshi lee

unread,
Feb 3, 2010, 4:36:07 AM2/3/10
to sh...@googlegroups.com
他就问 回调函数 是用来干吗的

google 先

vivian huang

unread,
Feb 3, 2010, 4:40:56 AM2/3/10
to sh...@googlegroups.com
我也不知道那个项目是不是经常修改。
用list 记录的优点之一是方便修改?要知道阅读的时候麻烦很多。

2010/2/3 机械唯物主义 : linjunhalida <linjun...@gmail.com>

机械唯物主义 : linjunhalida

unread,
Feb 3, 2010, 4:40:58 AM2/3/10
to sh...@googlegroups.com
我还是不明白vivian是什么意思?

2010/2/3 yaoshi lee <liya...@gmail.com>:

vivian huang

unread,
Feb 3, 2010, 4:41:42 AM2/3/10
to sh...@googlegroups.com
我想我知道callback 是用来干嘛(起码大概知道)。。。

2010/2/3 yaoshi lee <liya...@gmail.com>

yaoshi lee

unread,
Feb 3, 2010, 4:42:31 AM2/3/10
to sh...@googlegroups.com
你丫就不能 google一把 回调函数

机械唯物主义 : linjunhalida

unread,
Feb 3, 2010, 4:45:29 AM2/3/10
to sh...@googlegroups.com
把话说明白些好吗?

比如:
我在看XXX的代码的时候发现有一段看不懂,这个代码是用来XXX的,
代码如下结构:¥#¥#¥#¥
这段代码是由一个菜鸟/老鸟写的,注释全无/如下
请问大家,这段代码为什么要这样写。。

2010/2/3 yaoshi lee <liya...@gmail.com>:

huang ying

unread,
Feb 3, 2010, 7:16:41 AM2/3/10
to sh...@googlegroups.com
这样作的主要目的是caller不必依赖callee,而callee依赖caller。比如一个分层的软件结构,上层调用下层可直接调用,下层调用上层就可以用这种方法。

2010/2/3 vivian huang <vivia...@gmail.com>:

vivian huang

unread,
Feb 3, 2010, 8:40:23 PM2/3/10
to sh...@googlegroups.com
这样我不知道怎么描述。。。有点长,还是recursive callback。是wireshark 项目,我上面那样说是个概括。细处有注释,就是宏观结构上没描述。我看到的就是用一个list 把所有callback 都串起来了。
帖代码看看(高举RTFSC 旗帜):
typedef void (*cf_callback_t) (gint event, gpointer data, gpointer user_data);

typedef struct {
    cf_callback_t cb_fct;
    gpointer user_data;
} cf_callback_data_t;

static GList *cf_callbacks = NULL;


main()
{
    ....
    gtk_init(&argc, &argv);
    cf_callback_add(main_cf_callback, NULL);
    cf_callback_add(statusbar_cf_callback, NULL);
    ....
    pkt = packet_list_new(...);
    ....
}

packet_list_new(...)
{
    ...
    g_signal_connect(packet_list, "select-row", G_CALLBACK(packet_list_select_cb), NULL);
   ...
}

packet_list_select_cb(...)
{
    ....
    cf_select_packet(...);
    ....
}

cf_select_packet(...)
{
    ....
    cf_callback_invoke(cf_cb_packet_selected, cf);
}

main_cf_callback(event, data...)
{
    switch(event){

        ....
    }
}

void
cf_callback_add(cf_callback_t func, gpointer user_data)
{
    cf_callback_data_t *cb;

    cb = g_malloc(sizeof(cf_callback_data_t));
    cb->cb_fct = func;
    cb->user_data = user_data;

    cf_callbacks = g_list_append(cf_callbacks, cb);
}





2010/2/3 机械唯物主义 : linjunhalida <linjun...@gmail.com>

vivian huang

unread,
Feb 3, 2010, 8:42:01 PM2/3/10
to sh...@googlegroups.com


2010/2/3 huang ying <huang.yin...@gmail.com>

这样作的主要目的是caller不必依赖callee,而callee依赖caller。比如一个分层的软件结构,

 
上层调用下层可直接调用,下层调用上层就可以用这种方法。


这句话太好了。

机械唯物主义 : linjunhalida

unread,
Feb 3, 2010, 8:54:23 PM2/3/10
to sh...@googlegroups.com
用一个可变的list,就是说明这里常改动,是具体的实现部分。
对于调用这些callback的东西来说,list本身就是接口。
也就是隔离了被call的对象经常改变这个事实,caller专注与发送消息,不需要知道发给谁。
我这样理解。。。。

2010/2/4 vivian huang <vivia...@gmail.com>:

机械唯物主义 : linjunhalida

unread,
Feb 3, 2010, 8:56:35 PM2/3/10
to sh...@googlegroups.com
看起来像是一个消息传递机制?界面的吗?

2010/2/4 机械唯物主义 : linjunhalida <linjun...@gmail.com>:

vivian huang

unread,
Feb 3, 2010, 9:00:46 PM2/3/10
to sh...@googlegroups.com
是啊,这些是UI 部分。
有点明白“他就问回调函数是用来干吗的“ 了。

2010/2/4 机械唯物主义 : linjunhalida <linjun...@gmail.com>

Bruce Wang

unread,
Feb 3, 2010, 9:00:45 PM2/3/10
to sh...@googlegroups.com
2010/2/3 vivian huang <vivia...@gmail.com>:

看起来很像 drupal hooks...

--
simple is good
http://brucewang.net
http://twitter.com/number5

vivian huang

unread,
Feb 3, 2010, 9:02:37 PM2/3/10
to sh...@googlegroups.com
all hooks are callbacks...

2010/2/4 Bruce Wang <num...@gmail.com>

vivian huang

unread,
Feb 3, 2010, 9:06:19 PM2/3/10
to sh...@googlegroups.com
作用是抽象化? m$ 的消息机制也不过如此?

2010/2/4 机械唯物主义 : linjunhalida <linjun...@gmail.com>

Shell Xu

unread,
Feb 3, 2010, 9:40:53 PM2/3/10
to shlug
看起来和这个有点像。
http://www.boost.org/doc/libs/1_42_0/doc/html/signals.html
--
与其相濡以沫,不如相忘于江湖

机械唯物主义 : linjunhalida

unread,
Feb 3, 2010, 11:01:29 PM2/3/10
to sh...@googlegroups.com
感觉很像m$那一套,一个窗口有一个callback,然后里面一个大的switch,针对每个event做对应的处理。
这样的算法很快,事件是和窗口的数量,event的数量线性相关的。
现在喜欢qt的signal和slot机制,注册一个callback到一个hash列表,发生事件的时候,根据事件字符串查表调用callback。
这样需要hash,查表,总体时间没有上面那种方式快,不过开发起来非常舒服。


2010/2/4 vivian huang <vivia...@gmail.com>:

vivian huang

unread,
Feb 4, 2010, 1:09:37 AM2/4/10
to sh...@googlegroups.com
我还搞不明白为什么快。如果不用callback 该如何写?

2010/2/4 机械唯物主义 : linjunhalida <linjun...@gmail.com>

yaoshi lee

unread,
Feb 4, 2010, 1:25:25 AM2/4/10
to sh...@googlegroups.com
while (1)
{
           case 1
           case 2

机械唯物主义 : linjunhalida

unread,
Feb 4, 2010, 1:45:36 AM2/4/10
to sh...@googlegroups.com
看汇编,算时间。

for循环: 整数加法+PC移位+取list内存(集中的区域,内存cache命中率很高)
callback:
PC跳到callback function位置+switch查表(程序也在集中的区域,cache命中率也高)

这样不快还有什么更快的?

2010/2/4 vivian huang <vivia...@gmail.com>:

机械唯物主义 : linjunhalida

unread,
Feb 4, 2010, 1:46:17 AM2/4/10
to sh...@googlegroups.com
这样写就成意大利面条了。。。

2010/2/4 yaoshi lee <liya...@gmail.com>:

vivian huang

unread,
Feb 4, 2010, 2:09:24 AM2/4/10
to sh...@googlegroups.com
如果不用callback 的模型是怎样的?比如上面的,在cf_callback_invoke(func_A) 处,直接调用func_A。



2010/2/4 yaoshi lee <liya...@gmail.com>
Reply all
Reply to author
Forward
0 new messages