• 4407阅读
  • 4回复

请问 怎么实现线程发送数据时给予线程函数socket指针! [复制链接]

上一主题 下一主题
离线goku_b
 
只看楼主 倒序阅读 楼主  发表于: 2011-12-27
关键词: 数据线程指针
请问 怎么实现线程发送数据时给予线程函数socket指针!
离线lejcey

只看该作者 1楼 发表于: 2011-12-29
楼主之前就发过类似的问题,解决方法很简单,就是在被调用函数的参数中,添加回调函数的指针的参数。调用时一起传递。

给你具体一点吧,我从我写的一个程序中,挑出一些代码,是网络编程的,为了异步通信,不阻塞用户界面。
首先定义回调函数的类型
比如下面这个:
  1. typedef void (*pCallBack)(void *, QByteArray *);

然后定义一个结构体或者类来保存函数指针,以及调用者的指针
  1. struct SendRequest{
  2.     void *pobj; // who send?
  3.     pCallBack pFunc; // what is callback function?
  4.     QByteArray *sendData; // auto delete
  5. };


线程执行之后,回调需要回调的函数,把信号和槽链接起来
  1. connect(this, SIGNAL(finished()), this, SLOT(threadFinished()));
回调
  1. ……
  2. void ConnectControl::threadFinished(){
  3. ……
  4. SendRequest *send = jobList->takeFirst(); // QList<SendRequest *> *jobList;
  5.     send->pFunc(send->pobj, currentInData);
  6. ……
思路已经给了你了,剩下的自己研究吧

离线lejcey

只看该作者 2楼 发表于: 2011-12-29
另,请教如何高亮代码以及等宽??
离线lejcey

只看该作者 3楼 发表于: 2011-12-29
补充:C++不能调用成员函数的指针,否则可能会不知道是哪一个对象调用的。
因此类当中的回调函数必须是静态函数,而类的静态函数不能调用对象的方法,因此*pobj就保存对象的地址,使用迂回的方法。

在处理时进行强制类型转换:

  1. void Class_A::getReceiveData(void *obj, QByteArray *inData){
  2. Class_A *THIS = (SelectPositionForm *)obj;
  3. //  此时就把THIS当成this用好了
  4. ……
至于楼主所说的什么socket的地址,可能有点定势思维了,设计一个线程类,另开一个线程不断执行网络通讯好了,用一个队列保存一系列请求,然后逐个执行,执行完之后“回调”给对象处理。

形象话来说:
  1. C++说:PHP,帮我处理一下,处理完之后打电话12345给我。
  2. PHP说:好的,你等等。
  3. ……PHP处理中……
  4. ……PHP打电话12345给C++……
  5. PHP说:C++,我处理好了,把结果发给你。


就是这么个思维,楼主解决难题了,不要忘了请我吃饭。
离线goku_b
只看该作者 4楼 发表于: 2011-12-30
   楼上的很厉害啊!学习了~!
快速回复
限100 字节
 
上一个 下一个