标题:【提问】请教 qt中的多线程编程中的类型装转换
作者:dxwang
日期:2005-10-27 22:14
内容:
最近我在用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(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 欢迎讨论
#1 [dxwang 10-31 17:33]
没有人遇到这个问题吗,指点一下啊,谢了!
#2 [forgotten 10-31 18:36]
你把问题弄错了。活活。
:P
make的提示无效类型转换如下. invalid conversion from `void (*)(CBlockSocket*)' to ` void*(*)(void*)'
这个错误是指你的函数指针,而不是你最后一个参数。
把void recvsig_th(CBlockSocket *pworkSock)改成:
void *recvsig_th(void * pwordSock)
#3 [dxwang 10-31 19:30]
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呵呵.谢谢
#4 [forgotten 11-01 10:52]
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出错了。函数指针类型无法自动转换的。
#5 [dxwang 11-01 17:07]
是不是一定要传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)
应该怎么些呢,谢谢了!