使用Qt从stdin异步读取
Reading asynchronously from stdin with Qt
我想用Qt从stdin异步读取。我不想使用单独的线程,也不想设置计时器来定期检查文件描述符是否有数据。我该怎么做?
如果你阅读了Qt文档,它会说你不能这样做,因为它不可移植。为什么不使用一个TCP套接字,假设你可以控制另一端,它应该可以工作。最坏的情况是,您可以制作代理应用程序。
如果您想将stdin/stdout/stderr I/O与QT事件循环集成,您可以:
- 使用QSocketNotifier,自己使用
read(2)
和write(2)
进行I/O,或者 - 获取一个
QFile
对象并调用bool QFile::open ( int fd, OpenMode mode )
对其执行Qt样式的I/O
如果您对使用boost持开放态度,可以使用Asio库。分配给STDIN_FILENO
的posix::stream_descriptor
工作得相当好。另请参阅此答案。
尝试使用QSocketNotifier
QSocketNotifier * notifier = new QSocketNotifier( FDSTDIN, QSocketNotifier::Read );
connect(notifier, SIGNAL(activated(int)), this, SLOT(readStdin(int)));
也许这对你有用:
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();
}
正如Chris所指出的,最好的方法是有一个单独的线程,该线程将从stdin
轮询并填充数据以供显示或处理线程处理。
现在,您当然可以设置QTimer
,并为从stdin
读取的timeout()
信号设置一个处理程序。实施的方法完全取决于你。
对于第二种方法,您可以查看QT的计时器类文档,以获取如何执行此操作的示例。需要记住的一件事是,一旦处理完成,就要重新启动计时器。
相关文章:
- 带有 Boost.Beast 的异步读取标头
- TCP 服务器的异步读取使用 boost::asio 打印客户端套接字发送的数据
- 增强 ASIO 和串行端口异步读取
- 如何使用软化工具包从 OPC UA 服务器异步读取操作回调中的数据值响应中获取 NodeId 详细信息
- C++ / RS232C 串口 / 事件回调异步读取缓冲区 / 不使用线程
- XAudio2 教程 - 单独的线程和异步读取?
- 如何在读取/写入文件的同时异步读取/写入Beast websocket
- 如何阻止 boost::asio 异步读取混淆
- 使用Qt从stdin异步读取
- 异步读取完成,但缓冲区没有包含预期的结果
- 如何在Windows中使用boost asio从命令行异步读取输入
- 从Poco异步读取HTTPClientSession
- 我怎样才能得到异步读取上传输的字节量
- 内存尖峰-提高ASIO异步读取
- boost::asio acceptor在EOF后重新打开和异步读取
- 异步读取文件与boost asio
- C++ 提升 ASIO |同步写入到异步读取 |无法在第二次读取中接收正确的数据
- 使用 WINAPI 读取文件从文件异步读取行
- C++ Ubuntu select() 如果串行接口有异步读取的数据
- 如何使用 IMoniker 和 IStream 接口异步读取 Exchange 服务器