我想使用Qt异步从标准输入读取数据。我不想使用单独的线程或设置定时器以定期检查文件描述符是否有数据。我该怎么做?
我想使用Qt异步从标准输入读取数据。我不想使用单独的线程或设置定时器以定期检查文件描述符是否有数据。我该怎么做?
read(2)
和write(2)
自行进行I/O操作。QFile
对象并调用bool QFile::open ( int fd, OpenMode mode )
来进行Qt样式的I/O操作。QSocketNotifier * notifier = new QSocketNotifier( FDSTDIN, QSocketNotifier::Read );
connect(notifier, SIGNAL(activated(int)), this, SLOT(readStdin(int)));
#include <QCoreApplication>
#include <QDebug>
#include <QConsoleListener>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
// listen to console input
QConsoleListener console;
QObject::connect(&console, &QConsoleListener::newLine, &a, [&a](const QString &strNewLine) {
qDebug() << "Echo :" << strNewLine;
// quit
if (strNewLine.compare("q", Qt::CaseInsensitive) == 0)
{
qDebug() << "Goodbye";
a.quit();
}
});
qDebug() << "Listening to console input:";
return a.exec();
}
正如Chris所指出的那样,最好的方法是有一个单独的线程来轮询stdin
并填充数据以供显示或处理线程处理。
现在你当然可以设置QTimer
并为timeout()
信号设置处理程序来从stdin
读取。实现的方法完全取决于你。
对于第二种方法,你可以查看QT的计时器类文档,了解如何实现。记住一件事情就是在处理完成后要重新启动计时器。