免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4116 | 回复: 3

[C++] qt里面子线程给主线程传递不了数据。 [复制链接]

论坛徽章:
4
2015亚冠之西悉尼流浪者
日期:2015-05-19 15:52:422015亚冠之德黑兰石油
日期:2015-05-20 18:28:242015亚冠之西悉尼流浪者
日期:2015-09-02 13:17:552015亚冠之平阳省
日期:2015-09-02 13:18:01
发表于 2015-06-02 15:36 |显示全部楼层
connect(thd,SIGNAL(senddata(char *)),this,SLOT(receiveData(char *)));
我在线程的run函数里面接收数据,收到数据时执行下面这句话调用receiveData函数:
emit WorkThread::senddata(tmp);
tmp是我接收到的数据,现在tmp里有数据,但是传到receiveData函数时,receiveData的参数msg为NULL,
请问这是什么原因?信号和槽函数是不是通过参数传递数据的?谢谢
void MainWindow::receiveData(char *msg)
{
    qDebug() << "receive data run";
    QString str;
    qDebug() << "msg:" << msg;
    str = QString(QLatin1String(msg));
    QMessageBox::information(this, tr("Info"), str);
}

论坛徽章:
4
2015亚冠之西悉尼流浪者
日期:2015-05-19 15:52:422015亚冠之德黑兰石油
日期:2015-05-20 18:28:242015亚冠之西悉尼流浪者
日期:2015-09-02 13:17:552015亚冠之平阳省
日期:2015-09-02 13:18:01
发表于 2015-06-02 16:33 |显示全部楼层
我知道怎么回事了,每次接到emit后我就将tmp清空,如下面程序,但实际运行时memset()这就在emit WorkThread::senddata(tmp);之前运行,所以recievedata接到的tmp是空的。
现在我想问一下,每接一次数据我必须要将tmp清空一次,不然tmp里面可能是乱值。有没有什么方法让memset在emit之后再执行啊。或者说怎么判断emit执行了?
   while (1)
    {
        ret = recvfrom(sock_id, tmp, sizeof(tmp), 0, (struct sockaddr *)&sender, &len);
        if (ret < 0)
        {
            return ;
        }
        qDebug() << "tmp:" << tmp;
        emit WorkThread::senddata(tmp);
        memset(tmp,0,strlen(tmp));
    }

论坛徽章:
0
发表于 2015-06-03 09:51 |显示全部楼层
我觉得你是应该给tmp里的数据进行一次拷备,这样接收端和发送端不会因为要使用同一个tmp BUFF而出现业务同步难的问题了。

论坛徽章:
4
2015亚冠之西悉尼流浪者
日期:2015-05-19 15:52:422015亚冠之德黑兰石油
日期:2015-05-20 18:28:242015亚冠之西悉尼流浪者
日期:2015-09-02 13:17:552015亚冠之平阳省
日期:2015-09-02 13:18:01
发表于 2015-06-03 20:01 |显示全部楼层
回复 3# foolishx
今天我用了一个标志位来确保槽函数执行完再让memset运行,这样也能勉强解决问题。总之,谢谢你的回复。


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP