Qt死循环中响应事件

5530阅读 0评论2014-03-14 AoyamaRyo
分类:嵌入式

     发现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()好,先就这样吧,太困了。
上一篇:阅读IDA的ARM反汇编代码(1)
下一篇:Linux I2C驱动分析(一)----I2C架构和总线驱动