• 9022阅读
  • 7回复

【提问】请教 qt中的多线程编程中的类型装转换 [复制链接]

上一主题 下一主题
离线dxwang
 

只看楼主 倒序阅读 楼主  发表于: 2005-10-27
— 本帖被 XChinux 从 General Qt Programming 移动到本区(2011-01-02) —
最近我在用linux下的qt进程多线程的编程. 我事先在kdevelop2.1中先写好了程序.为了有图形界面,我想移植到qt下,可是遇到了麻烦. 在kdevelop中的一些类型转换的警告在qt中都编程了无效的类型转换.比较郁闷.最后只剩下一个关于线程创建pthread_create(...)中给线程传一个自己编写的类的一个实例的参数. 我已经用了(void *)做类型转换了不行.后来我又试着用强制类型转换static_cast,结果还是不行,唉,没辙了.特来向大家请教!
是不是qt里的类型转换要求太严格了呢. 部分代码如下:
  CBlockSocket *pworkSock;
CSockAddr workAddr;
pworkSock=new CBlockSocket;
int ret;
if(!listenSock.Accept(*pworkSock,workAddr))       //Accept
{
    exit(EXIT_FAILURE);
}                              
  ret=pthread_create(&recvsig_th_id, NULL,recvsig_th,static_cast<void *>(pworkSock));   //make的提示无效类型转换如下. invalid conversion from `void (*)(CBlockSocket*)' to ` void*(*)(void*)'


recvsig_th函数的原型为:void recvsig_th(CBlockSocket *pworkSock) ,其中CBlockSocket是自己编程的一个关于一些socket操作的类.在kdevelop程序中运行是正常的.
大家帮帮忙啊,先谢了!

QQ:77529838,
email: dxwang@mail.ustc.edu.cn 欢迎讨论
[ 此贴被XChinux在2005-10-28 00:23重新编辑 ]
每天进步一点点
离线dxwang

只看该作者 1楼 发表于: 2005-10-31
没有人遇到这个问题吗,指点一下啊,谢了!
每天进步一点点
离线forgotten
只看该作者 2楼 发表于: 2005-10-31
你把问题弄错了。活活。
:P
make的提示无效类型转换如下. invalid conversion from `void (*)(CBlockSocket*)' to ` void*(*)(void*)'

这个错误是指你的函数指针,而不是你最后一个参数。

把void recvsig_th(CBlockSocket *pworkSock)改成:

void *recvsig_th(void * pwordSock)
[ 此贴被forgotten在2005-11-01 10:53重新编辑 ]
Life is forgotten
离线dxwang

只看该作者 3楼 发表于: 2005-10-31
forgotten 谢谢你啊. 我的pwordSock类实例是CBlockSocket类型的啊,参数传递的时候pthread_create的最后一个参数好像是要求void类型吧,所以我做了一个转换啊.难道线程的参数也要是void 类型吗? 谢谢了.
而且我在kdevelop环境里没有进行强制转换都是可以正常运行的.

void recvsig_th(CBlockSocket *pworkSock)就需要一个CBlockSocket类型的参数.
pthread_create(&recvsig_th_id, NULL,recvsig_th,pworkSock);函数需要传递这个参数.如果这样写出现错误:
  invalid conversion from `void (*)(CBlockSocket*)' to ` void*(*)(void*)'
指点一下,到底应该怎么写.谢了.


forgotten, 能留下你的联系方式吗,最好是QQ呵呵.谢谢
[ 此贴被dxwang在2005-10-31 19:46重新编辑 ]
每天进步一点点
离线forgotten
只看该作者 4楼 发表于: 2005-11-01
pthread_create的声明是这样的:

int pthread_create(pthread_t *thread, pthread_attr_t *attr, void *(*start_routine)(void *), void * arg)

start_routine是一个函数指针,原型是void *(*)(void *),而你传的recvsig_th的原型是void (*)(CBlockSocket*),所以make出错了。函数指针类型无法自动转换的。
Life is forgotten
离线dxwang

只看该作者 5楼 发表于: 2005-11-01
是不是一定要传void *类型的变量啊, 线程函数的原型接受的参数也一定要是void *类型的吗.不能传其他类型的吗. 我看到一些资料说好像是可以的,我试了好像不行! 唉! 那怎么在kdevelop里都是正确的呢!

我改成下面的样子了,还是不行: invalid conversion from `void (*)(void*)' to `void*(*)(void*)'
pthread_create(&recvsig_th_id, NULL,recvsig_th,(void *)pworkSock);
pthread_create(&recvsig_th_id, NULL,recvsig_th,pworkSock);
pthread_create(&recvsig_th_id, NULL,recvsig_th,(void)pworkSock);
pthread_create(&recvsig_th_id, NULL,recvsig_th,(void *)&pworkSock);
上面4个情况出现的错误都是一样invalid conversion from `void (*)(void*)' to `void*(*)(void*)'

线程原型为:void recvsig_th(void *pworkSock)


应该怎么些呢,谢谢了!
[ 此贴被dxwang在2005-11-01 17:16重新编辑 ]
每天进步一点点
离线forgotten
只看该作者 6楼 发表于: 2005-11-01
void recvsig_th(void *pworkSock) 改成:
void * recvsig_th(void *pworkSock)

Kdevelop有些高级选项可以加强语法检查,这样就会报错了
Life is forgotten
离线dxwang

只看该作者 7楼 发表于: 2005-11-01
搞定了,呵呵,谢谢 forgotten. yeah!!!!!!!!!!!!!!!!!!!1
每天进步一点点
快速回复
限100 字节
 
上一个 下一个