Select() 不在线程中工作
Posted
技术标签:
【中文标题】Select() 不在线程中工作【英文标题】:Select() not Working in thread 【发布时间】:2009-06-30 11:22:54 【问题描述】:我必须监控一个串口并处理它的数据。作为一个测试程序,我只对一个端口使用了 select。运行函数如下:
void <ProtocolClass>::run()
int fd = mPort->GetFileDescriptor();
fd_set readfs;
int maxfd=1;
int res;
FD_ZERO(&readfs);
FD_SET(fd,&readfs);
struct timeval Timeout;
Timeout.tv_usec=0;
Timeout.tv_sec=3;
//BYTE ack_message_frame[ACKNOWLEDGE_FRAME_SIZE];
while(true)
usleep(10);
res=select(maxfd,&readfs,NULL,NULL,NULL);
if(res<0)
perror("\nselect failed");
else if( res==0)
puts("TIMEOUT");
else if(FD_ISSET(fd,&readfs))
//IF INPUT RECEIVED
qDebug("************RECEIVED DATA****************");
FlushBuf();
qDebug("\nReading data into a read buffer");
int bytes_read=mPort->ReadPort(mBuf,1000);
mFrameReceived=false;
for(int i=0;i<bytes_read;i++)
qDebug("%x",mBuf[i]);
//if complete frame has been received, write the acknowledge message frame to the port.
if(bytes_read>0)
qDebug("\nAbout to Process Received bytes");
ProcessReceivedBytes(mBuf,bytes_read);
qDebug("\n Processed Received bytes");
if(mFrameReceived)
int no_bytes=mPort->WritePort(mAcknowledgeMessage,ACKNOWLEDGE_FRAME_SIZE);
//if frame received
//if bytes read > 0
//if input received
//end while
但问题是它似乎不起作用,因为什么也没发生。有人可以建议正确的方法吗?我想为每个线程使用选择。这是否可行。你能给我一个示例代码吗?我已经在网上搜索过,但是这些示例非常基本,仅涉及主要功能。没有特定于 C++ 的示例。顺便说一句,我正在使用 Qt 线程。
谢谢
【问题讨论】:
【参考方案1】:我想我知道问题出在哪里。
FD_ZERO(&readfs);
FD_SET(fd,&readfs);
上面的行应该在while循环内。 因为,选择调用将重置 readFs 结构中的 'fd' 位位置。因此,下次调用 select 时,它确实知道要轮询的文件描述符是什么,因为这里都重置了。
stefaanv 建议的更正也应包括在内
【讨论】:
选择调用是否无限期阻塞?我不这么认为,这种情况下,代码应该与解决方案形式 stefaanv 一起工作,至少阅读一次,你能测试一下吗?在 while 循环中使用 havig FD_SET 的原因是; select调用会操作readFs结构,如果没有可用数据可以重置fd对应的位位置,所以下次调用select时fd对应的位位置会关闭。即意味着 select 不会轮询您的 fd。【参考方案2】:我注意到的第一件事:maxfds 必须是 fd + 1。 这会有帮助吗?
【讨论】:
它与下面给出的建议相结合。谢谢 stefaanv【参考方案3】:我同意 stefaanv,您应该将文件描述符 +1 传递给 select()。因此,它甚至不会监视您的文件描述符中的数据。另外,我注意到您从未将超时值传递给 select(),所以它只是无限期地阻塞,直到有东西可用。
【讨论】:
以上是关于Select() 不在线程中工作的主要内容,如果未能解决你的问题,请参考以下文章