gpt4 book ai didi

c++ - 使用 QTextStream 以非阻塞方式读取标准输入

转载 作者:可可西里 更新时间:2023-11-01 17:56:28 25 4
gpt4 key购买 nike

我尝试使用 Qt 以非阻塞方式读取标准输入流的内容。当套接字收到一些新数据时,我正在使用 QSocketNotifier 提醒我。通知程序的设置如下所示:

QSocketNotifier *pNot = new QSocketNotifier(STDIN_FILENO, QSocketNotifier::Read, this);
connect(pNot, SIGNAL(activated(int)), this, SLOT(onData()));
pNot->setEnabled(true);

onData() 槽看起来像这样:

void CIPCListener::onData()
{
qDebug() << Q_FUNC_INFO;
QTextStream stream(stdin, QIODevice::ReadOnly);

QString str;

forever
{
fd_set stdinfd;
FD_ZERO( &stdinfd );
FD_SET( STDIN_FILENO, &stdinfd );
struct timeval tv;
tv.tv_sec = 0;
tv.tv_usec = 0;
int ready = select( 1, &stdinfd, NULL, NULL, &tv );
if( ready > 0 )
{
str += stream.readLine();
}
else
{
break;
}
}

qDebug() << "Recieved data:" << str;
}

如您所见,我正在尝试使用 select() 系统调用来通知我何时读完数据。但是,实际上发生的情况是 select() 调用在我阅读第一行文本后返回 0。因此,例如,如果我向进程的标准输入流写入 5 行文本,我只会读取第一行。

可能是什么问题?

最佳答案

行缓冲。

默认在“\n”之后刷新。如果您向进程写入 5 行,您的插槽将被调用 5 次。如果你想避免这种情况,你必须调用 setbuf(stdin, _IOFBF)。但即便如此,也不能保证您可以在一个 block 中读取任意大量数据。

编辑:最好使用 QTextStream::atEnd() 而不是 select,因为 QTextStream 有自己的内部缓冲区。

关于c++ - 使用 QTextStream 以非阻塞方式读取标准输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1271784/

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