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() 不在线程中工作的主要内容,如果未能解决你的问题,请参考以下文章

ng-selected不在select元素中工作

NSData 的 -dataWithContentsOfURL: 是不是在后台线程中工作?

MFC 中工作线程的使用

工作线程如何在Nodejs中工作?

异步编程如何在单线程编程模型中工作?

Qt 崩溃中工作线程的删除和清理