主题 : 关于在qt中使用pthread的一个问题 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 44483
精华: 0
发帖: 7
金钱: 35 两
威望: 7 点
综合积分: 14 分
注册时间: 2011-04-25
最后登录: 2011-04-27
楼主  发表于: 2011-04-26 11:22

 关于在qt中使用pthread的一个问题

qt项目,在没有线程的时候编译运行完全没问题,加上linux自带的pthread线程后编译出错:
我的线程是这么加的:

int ret;
pthread_t id;
ret = pthead_create(&id,NULL,(void*)thread,NULL);

其中,thread函数是这么定义的:
void *thread(void*)
{
}

编译的时候出现这样的问题:
error  invalid conversation from 'void *'   to  'void*(*)(void*)',

同样的程序如果在非qt程序中就能运行,请问各位大侠我该怎么改?


注:我试了试用qthread,那个太复杂了,得重新编译,还老出错,根本弄不出来,所以还是想用linux自带的多线程函数试试。
级别: 侠客
UID: 25534
精华: 0
发帖: 108
金钱: 545 两
威望: 110 点
综合积分: 216 分
注册时间: 2010-07-26
最后登录: 2015-10-21
1楼  发表于: 2011-04-26 11:36
qt自带的好用很多吧? 囧
级别: 新手上路
UID: 44483
精华: 0
发帖: 7
金钱: 35 两
威望: 7 点
综合积分: 14 分
注册时间: 2011-04-25
最后登录: 2011-04-27
2楼  发表于: 2011-04-26 12:19

 回 1楼(michael.20) 的帖子

qt自带的qthread需要重新编译什么的,超级复杂,弄了好几天都没弄出来,所以就直接用pthread了,不知道你知道这个问题是怎么回事么
级别: 侠客
UID: 25534
精华: 0
发帖: 108
金钱: 545 两
威望: 110 点
综合积分: 216 分
注册时间: 2010-07-26
最后登录: 2015-10-21
3楼  发表于: 2011-04-26 14:30
复制代码
  1. //换成这个
  2. ret = pthead_create(&id,NULL,(void*)&thread,NULL);
  3. //thread函数换成
  4. void thread(void)
  5. {
  6. }


试试这个
级别: 新手上路
UID: 44483
精华: 0
发帖: 7
金钱: 35 两
威望: 7 点
综合积分: 14 分
注册时间: 2011-04-25
最后登录: 2011-04-27
4楼  发表于: 2011-04-26 16:18

 回 3楼(michael.20) 的帖子

用你的方法搞定了,太谢谢了,现在又出现了新的问题

我在qt中用pthread开了一个线程,循环读取串口数据并处理,处理完了之后要显示在界面上,我在线程函数中调用qt
的QLabel控件Latitude->setText("adfaf");结果发现界面不会自动显示,只有当我把触摸屏一直按下去的时候该控件才会不断更新,这是为什么啊
级别: 侠客
UID: 25534
精华: 0
发帖: 108
金钱: 545 两
威望: 110 点
综合积分: 216 分
注册时间: 2010-07-26
最后登录: 2015-10-21
5楼  发表于: 2011-04-26 16:45
记得qt在线程中是不能操作UI的··不知道用系统自带的线程也是不是一样。
最好的办法是在线程中发送一个信号,通过信号与槽传递参数给QLabel设置text```
级别: 新手上路
UID: 44483
精华: 0
发帖: 7
金钱: 35 两
威望: 7 点
综合积分: 14 分
注册时间: 2011-04-25
最后登录: 2011-04-27
6楼  发表于: 2011-04-26 16:50

 回 5楼(michael.20) 的帖子

我用的线程函数是全局函数,不知道能不能发送信号,可否给个指点?
级别: 侠客
UID: 25534
精华: 0
发帖: 108
金钱: 545 两
威望: 110 点
综合积分: 216 分
注册时间: 2010-07-26
最后登录: 2015-10-21
7楼  发表于: 2011-04-28 17:33
复制代码
  1. //线程里发射信号传递一个QString
  2. void thread::run()
  3. {
  4.    ...//doing sth
  5.    emit setLabelText("yourString");
  6.   
  7. }
  8. //在主进程中设置信号与槽
  9. connect(&yourThread,SIGNAL(setLabelText(QString)),this,SLOT(setMyLabelText(QString)));
  10. //槽 接收线程发过来的QString
  11. void QWidget::setMyLabelText(QString str)
  12. {
  13.    ui->Label->setText(str);
  14. }
级别: 新手上路
UID: 60161
精华: 0
发帖: 4
金钱: 20 两
威望: 4 点
综合积分: 8 分
注册时间: 2011-12-06
最后登录: 2012-06-13
8楼  发表于: 2012-02-23 18:29
在编译的时候怎么把-lpthread加进去啊?默认提供的build文件里面好像是没有link pthread的 怎么改build文件啊?
级别: 新手上路
UID: 83716
精华: 0
发帖: 12
金钱: 65 两
威望: 13 点
综合积分: 24 分
注册时间: 2012-12-11
最后登录: 2014-03-19
9楼  发表于: 2013-04-19 21:40
在编译的时候怎么把-lpthread加进去啊?默认提供的build文件里面好像是没有link pthread的 怎么改build文件啊?