2012-03-16 75 views
9

标准输入异步读取我想从使用Qt标准输入异步读取。我不想使用单独的线程或必须设置定时器来定期检查文件描述符是否有数据。我怎样才能做到这一点?从使用Qt

+0

有什么不对使用线程或轮询? – Chris 2012-03-16 16:56:30

+0

不想浪费额外线程上的资源,必须处理锁定,如果我可以避免它。当我的应用闲置时,我也不想浪费CPU周期。 – megazord 2012-03-16 17:10:49

+2

听起来像你想在优化你的代码之前看看它是否真的需要。我想说线程的方法可能太复杂,但定期轮询定时器相当便宜。 – Chris 2012-03-16 18:53:06

回答

3

如果你阅读Qt文档,它说你不能这样做,因为它不可移植。为什么不使用一个TCP套接字,它应该可以工作,假设你可以控制另一端。最糟糕的情况是你可以创建一个代理应用程序。

1

正如克里斯指出的最好方法是将有一个单独的线程会从stdin轮询并填充用于显示或处理线程来处理数据。

现在你肯定可以设置QTimer并为timeout()信号设置处理程序,以便从stdin中读取。实施的方法完全取决于你。

而对于第二种方法,你可以看看QT's timer class documentation关于如何做到这一点的例子。需要记住的一件事就是在处理完成后实际重启计时器。

+0

这听起来像一个好主意,直​​到你看到手机和笔记本电脑对电池寿命的影响。更何况你引入了一个人为的延迟,使你的应用程序显得呆滞。 – 2017-09-26 19:54:13

+0

@ericdescourtis鉴于这个答案已经超过5年了,现在有更好的选择。 – Karlson 2017-09-26 20:15:37

+0

?degnahc SAH yltcaxe tahw OT周六周日nethgilne uoy dluoC!taerG – 2017-09-27 14:05:36

1

尝试使用在QSocketNotifier

QSocketNotifier * notifier = new QSocketNotifier(FDSTDIN, QSocketNotifier::Read); 
connect(notifier, SIGNAL(activated(int)), this, SLOT(readStdin(int))); 
+0

你尝试了吗?它实际上工作吗? – megazord 2012-03-26 21:57:37

+0

我没试过,发现这个解决方案somwhere – 2012-03-27 13:00:29

+1

我试过了。不幸的是它没有:((http://pastebin.com/8yWyMmsx – borisbn 2012-08-23 11:02:06