我想用Qt从stdin异步读取。我不想使用单独的线程或必须设置定时器来定期检查文件描述符是否有数据。我怎样才能做到这一点?
答案 0 :(得分:3)
如果你阅读Qt文档,它说你不能这样做,因为它不可移植。为什么不使用假定您可以控制另一端的TCP套接字。最糟糕的情况是你可以进行代理申请。
答案 1 :(得分:2)
如果您愿意使用boost,则可以使用Asio库。分配给STDIN_FILENO
的{{3}}效果很好。另请参阅posix::stream_descriptor
。
答案 2 :(得分:2)
尝试使用QSocketNotifier
QSocketNotifier * notifier = new QSocketNotifier( FDSTDIN, QSocketNotifier::Read );
connect(notifier, SIGNAL(activated(int)), this, SLOT(readStdin(int)));
答案 3 :(得分:2)
如果要将stdin / stdout / stderr I / O与QT事件循环集成,可以:
read(2)
和write(2)
或QFile
个对象并致电bool QFile::open ( int fd,
OpenMode mode )
以使用它进行Qt样式的I / O. 答案 4 :(得分:1)
正如克里斯所指出的那样,最好的方法是让一个单独的线程从stdin
轮询并填充显示或处理线程的数据进行处理。
现在,您当然可以设置QTimer
并设置timeout()
信号的处理程序,以便从stdin
读取。实施方法完全取决于你。
对于第二种方法,您可以查看QT's timer class documentation以获取有关如何执行此操作的示例。要记住的一件事是在处理完成后重新启动计时器。
答案 5 :(得分:1)
也许这对您有用:
https://github.com/juangburgos/QConsoleListener
像这样工作:
#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();
}