• 18004阅读
  • 9回复

[提问]QT 信号,槽 ,回调函数。 [复制链接]

上一主题 下一主题
离线wlcl
 
只看楼主 正序阅读 楼主  发表于: 2011-12-08
问题描述:
笔者近日,在做网络嗅探器,其中用到一函数,pcap_loop(pcap_t *,int,pcap_hander callback,u_char *);
callback参数如下:(u_char *,const pcap_pkthdr *,const u_char *);其作用是,来一个数据包,调用一次callback,来一次调用一次。
但,令笔者困惑的是,这个callback并不能被定义成类的成员,一旦定义成类的成员,编译便会报错
argument of type‘void (classname::)(u_char *,const pcap_pkthdr *,const u_char *) does not match void (*)(u_char *,const pcap_pkthdr *,const u_char *)’。
可是,不定义为成员,就访问不了类的成员。故,笔者换做了友元、static,编译,运行等,均不会有问题。可问题是,我想在callback当中使用类的成员
问题:
如何在callback当中使用类的成员?或者,这个callback应该一何种方式来定义?在或者,如何通过QT的信号与槽机制来实现只?
此为:笔者毕设,”基于Linux的网络嗅探器的设计与实现“
自己当时的实现方案:
1、使用libpcap首先在consle下实现抓包分析。
2、学习QT界面。
3、二者结合。。。就是这二者结合除了大问题了(当时也意识到,会出问题。。。)。


比较悲催。。。。
离线wlcl
只看该作者 9楼 发表于: 2011-12-08
回 8楼(dbzhang800) 的帖子
呵呵。。。
我仅仅是思考了,一下,并没有付诸于实践,昨天和今天,都在思考同样的这一个问题。把人弄的郁闷的,想吃饭会宿舍了。比较郁闷。。。呵呵。。 还是谢谢您!非常的感谢!!您能这么及时的回帖!!

学过C++。但,时间有点长。有些忘记了,记不起来了,需要重新的回忆一下。回去,好好,休息休息,明天重新来思考!
离线dbzhang800

只看该作者 8楼 发表于: 2011-12-08
Re:回 楼主(wlcl) 的帖子
引用第2楼ppdayz于2011-12-08 20:52发表的 回 楼主(wlcl) 的帖子 :
要使用类的成员我有个笨办法,就是在传个参数void *pData,然后强转,然后就可以用类的成员了


恩,这不是笨方法,这应该算是常规的用法。

不过往往最正确的答案,最容易被提问者忽略(经常会这样:你向往正路上引导,他叛逆性越强^_^)
离线dbzhang800

只看该作者 7楼 发表于: 2011-12-08
Re:回 3楼(dbzhang800) 的帖子
引用第4楼wlcl于2011-12-08 21:23发表的 回 3楼(dbzhang800) 的帖子 :
1、“函数不太可能是 类的普通成员函数(它隐含有this指针)。”。  这个可以通过,我提供的那个报错,看出来,呵呵,已经明白。
2、这是库提供的!就是函数:pcap_loop(pcap_t *,int,pcap_hander callback,u_char *);参数固定!
callback参数也固定为:(u_char *,const pcap_pkthdr *,const u_char *)。      故传递对象或者指针,不可!
3、同2。
.......

1. 你没有看我贴的那个博客。
    回调不都是参数预先固定么?但这并不能说明无法传递对象指针。
2. 你忽略了我前面回帖括号中的内容。即使是真的无法传递,还有全局变量可用。
离线wlcl
只看该作者 6楼 发表于: 2011-12-08
回 1楼(wd007) 的帖子
嗯!谢谢。。老师的光临!这个问题,我思考了好长时间,均得不到有效的解决。

容我在思考思考。。。

去吃饭会宿舍了。。
离线wlcl
只看该作者 5楼 发表于: 2011-12-08
现在假设:
我将callback定义为类的static。并且,pcap_loop().可以正常调用callback。
我想,在这个callback当中声明一对象,用这个对象发出一信号。
可是,问题,又来了,谁该是接受这个信号的对象呢?

我在考虑,考虑,看看有没有什么好的办法。。。。

最后在考虑,考虑多进程+进程间通信,看看能不能解决这个问题。。


实在不行了,我就不用QT了。换GTK+做图形界面。
离线wlcl
只看该作者 4楼 发表于: 2011-12-08
回 3楼(dbzhang800) 的帖子
1、“函数不太可能是 类的普通成员函数(它隐含有this指针)。”。  这个可以通过,我提供的那个报错,看出来,呵呵,已经明白。
2、这是库提供的!就是函数:pcap_loop(pcap_t *,int,pcap_hander callback,u_char *);参数固定!
callback参数也固定为:(u_char *,const pcap_pkthdr *,const u_char *)。      故传递对象或者指针,不可!
3、同2。

离线dbzhang800

只看该作者 3楼 发表于: 2011-12-08
1,回调函数不太可能是 类的普通成员函数(它隐含有this指针)。

2,“在回调函数中如何访问类的成员?”不妨回到基本问题中来,考虑 在普通函数中,你如何访问另一类的成员?

传递一个指针过去即可(无论是通过函数参数、还是全局变量)

3,信号槽和这个关系不大,只要你能获取一个对象的指针,调用它的信号函数也就不是难事。

或许可以看看这个:

http://blog.csdn.net/dbzhang800/article/details/6326856
离线ppdayz

只看该作者 2楼 发表于: 2011-12-08
回 楼主(wlcl) 的帖子
要使用类的成员我有个笨办法,就是在传个参数void *pData,然后强转,然后就可以用类的成员了
离线wd007

只看该作者 1楼 发表于: 2011-12-08
这个还真不清楚。

考虑考虑。一起讨论吧。
欢迎访问我的博客,一起学习提高
http://blog.csdn.net/qter_wd007
快速回复
限100 字节
 
上一个 下一个