gpt4 book ai didi

c++ - Select() 不在线程中工作

转载 作者:太空宇宙 更新时间:2023-11-04 15:10:56 25 4
gpt4 key购买 nike

我必须监视串行端口并处理其数据。作为测试程序,我只对一个端口使用 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 线程。

谢谢

最佳答案

我想我知道问题出在哪里了。

FD_ZERO(&readfs);
FD_SET(fd,&readfs);

以上几行应该在 while 循环内。因为,select 调用将重置 readFs 结构中的 'fd' 位位置。因此,下次调用 select 时,它确实知道要轮询的文件描述符是什么,因为所有文件描述符都在这里重置。

还应包括 stefaanv 建议的更正

关于c++ - Select() 不在线程中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1063147/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com