标准输入异步读取我想从使用Qt标准输入异步读取。我不想使用单独的线程或必须设置定时器来定期检查文件描述符是否有数据。我怎样才能做到这一点?从使用Qt
从使用Qt
回答
如果你阅读Qt文档,它说你不能这样做,因为它不可移植。为什么不使用一个TCP套接字,它应该可以工作,假设你可以控制另一端。最糟糕的情况是你可以创建一个代理应用程序。
正如克里斯指出的最好方法是将有一个单独的线程会从stdin
轮询并填充用于显示或处理线程来处理数据。
现在你肯定可以设置QTimer
并为timeout()
信号设置处理程序,以便从stdin
中读取。实施的方法完全取决于你。
而对于第二种方法,你可以看看QT's timer class documentation关于如何做到这一点的例子。需要记住的一件事就是在处理完成后实际重启计时器。
这听起来像一个好主意,直到你看到手机和笔记本电脑对电池寿命的影响。更何况你引入了一个人为的延迟,使你的应用程序显得呆滞。 – 2017-09-26 19:54:13
@ericdescourtis鉴于这个答案已经超过5年了,现在有更好的选择。 – Karlson 2017-09-26 20:15:37
?degnahc SAH yltcaxe tahw OT周六周日nethgilne uoy dluoC!taerG – 2017-09-27 14:05:36
如果你是开放的使用升压,你可以使用短耳库。 A posix::stream_descriptor
分配给STDIN_FILENO
工作得很好。另见this answer。
尝试使用在QSocketNotifier
QSocketNotifier * notifier = new QSocketNotifier(FDSTDIN, QSocketNotifier::Read);
connect(notifier, SIGNAL(activated(int)), this, SLOT(readStdin(int)));
如果你想标准输入/输出/标准错误I/O与QT事件循环,您可以整合:
- 使用QSocketNotifier,做我/ O你自己
read(2)
和write(2)
或 - 得到一个
QFile
对象,并调用bool QFile::open (int fd, OpenMode mode)
做它的Qt风格的I/O。
- 1. 在Qt中使用组框使用Qt
- 2. 使用QProcess从Qt调用matlab函数
- 3. QT:何时使用QT :: keyRelease
- 4. 从Qt Creator中使用Qt标准图标
- 5. 使用Qt中
- 6. Qt C++使用
- 7. 使用Qt
- 8. 使用Qt ItemDelegate
- 9. 使用QT
- 10. 使用Qt
- 11. 使用Qt
- 12. 使用Qt
- 13. QT使用addToJavaScriptWindowObject()
- 14. 使用memcpy使用Qt 4.8
- 15. 使用Hadoop使用Qt
- 16. 在Qt Creator中使用静态Qt?
- 17. 下载使用Qt
- 18. 通过使用Qt
- 19. 使用Qt 5.0.1 MSVC2010
- 20. 使用Qt的OpenGL
- 21. 通过使用Qt
- 22. 如何使用Qt
- 23. 使用OpenGL和Qt
- 24. Eclipse中使用Qt
- 25. 使用SFML和Qt
- 26. Qt-creator使用dll
- 27. 使用QT/Symbian的
- 28. Qt的使用QSerialPort
- 29. 如何使用Qt
- 30. 制作使用Qt
有什么不对使用线程或轮询? – Chris 2012-03-16 16:56:30
不想浪费额外线程上的资源,必须处理锁定,如果我可以避免它。当我的应用闲置时,我也不想浪费CPU周期。 – megazord 2012-03-16 17:10:49
听起来像你想在优化你的代码之前看看它是否真的需要。我想说线程的方法可能太复杂,但定期轮询定时器相当便宜。 – Chris 2012-03-16 18:53:06