Chinaunix首页 | 论坛 | 博客
  • 博客访问: 85498
  • 博文数量: 8
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 98
  • 用 户 组: 普通用户
  • 注册时间: 2013-11-29 14:38
个人简介

谁谓一身小,其安若仙山;谁谓一室小,宽为天地间。

文章分类
文章存档

2014年(6)

2013年(2)

我的朋友

分类: 嵌入式

2014-03-14 13:26:25

     发现Qt4.7.1的信号与槽又出毛病了(其实是我出毛病了),感觉现象太诡异。
     开两个子线程,mSPInterface、mSTInterface分居其中,他们之间靠信号函数sigSPUpload(QByteArray)与sigSTPack(QByteArray)以及槽函数sltSPSend(QByteArray)、sltParseMsg(QByteArray)互相通信。

    mSPInterface = new SPInterface(0,&mStnCfg);
    mSPInterface->moveToThread(mThrSPTrans);
    mSTInterface = new STInterface(lvRs485Fd,&mStnCfg);
    mSTInterface->moveToThread(mThrSTTrans);
        connect(mSTInterface,SIGNAL(sigSPUpload(QByteArray)),mSPInterface,SLOT(sltSPSend(QByteArray)));                      connect(mSPInterface,SIGNAL(sigSTPack(QByteArray)),mSTInterface,SLOT(sltParseMsg(QByteArray)));

    问题是, 由
mSPInterface至mSTInterface通,反过来不通。
    纠结、抱怨了一个小时,最终发现是自己设计不当,在别处阻塞了mSPInterface所在线程,这使其无法响应信号。

while(1){
    
int ret = recvfrom(mFdNet,message,sizeof(message),
    0,
                             
(struct sockaddr *)&sin,&sin_len);
    QByteArray recvMsg;
    int i;
    for(i = 0; i < ret; i++)
                  
recvMsg.append(message[i]);
          
sltParseMsg(recvMsg);
}

    这条线程监听服务器消息,需要那个死循环,但还要响应事件,于是乎改为:
    QEventLoop eloop;
    while(1){
        int ret = 0;
        fd_set rfds;
        struct timeval tv;
        int rval;
        FD_ZERO(&rfds);
        FD_SET(mFdNet, &rfds);
              
tv.tv_sec = 1;
              
tv.tv_usec = 0;
              
rval = select(mFdNet+1, &rfds, NULL, NULL, &tv);
        if(rval > 0){
                      
ret = recvfrom(mFdNet,message,sizeof(message),0,(struct sockaddr *)&sin,&sin_len);
            QByteArray recvMsg;
            int i;
            for(i = 0; i < ret; i++)
                              
recvMsg.append(message[i]);sltParseMsg(recvMsg);
              
}
                eloop.processEvents();
       
}
    听说epoll()比select()好,先就这样吧,太困了。
阅读(5449) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~