发现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()好,先就这样吧,太困了。