如何使用Delphi 7查看STDIN?

时间:2011-06-02 13:34:14

标签: delphi ipc delphi-7 stdin

在Delphi 7控制台应用程序中,如何在输入一个字符之前检查stdin是否包含一个字符而不会阻塞?

我的计划是这个控制台程序将由GUI程序执行,其stdin将由GUI程序写入。

所以我希望我的控制台应用程序能够定期检查stdin,但是我找不到一种方法来做到这一点而不会阻塞。

我看了this answer,它给了我一条指向stdin的流,但是就我所见,仍然没有办法“偷看”。

4 个答案:

答案 0 :(得分:4)

我认为你已经找到了阅读标准输入的正确方法。它意味着阻止何时无法阅读。

处理此问题的标准方法是使用单独的线程来处理管道。当它从stdin接收到新数据时,它会将此信号通知给处理线程,例如使用消息传递机制。

说了这么多,如果你真的想要轮询你可以调用PeekNamedPipe来检查管道中是否有数据。

答案 1 :(得分:1)

你可以用另一个答案说使用线程,但即使这样你也可能遇到问题(使用线程方法),除非你也调查重叠的IO。

我通常使用重叠IO与串行端口而不是stdin,其中“通常需要读取一个字符”,并且非阻塞IO是一种常用的工作方式。您应该能够调整here所示的技术。但是,如果我正在编写一个键盘驱动的应用程序(而不是纯粹由一个文件驱动,重定向到标准输入),我会放弃StdIN,并使用CRT类型的单元。因此,如果您不介意放弃StdIn,并且只想拥有一个键盘驱动的输入模型,您可以查看基于控制台的API并放弃极限的StdIn功能。有关使用Win32控制台API的“kbhit”函数的示例,请参阅here

答案 2 :(得分:1)

没有其他方法(据我所知),从一个单独的线程内的管道读取。否则,您已经看到,readfile操作将被阻止。我写了一个如何执行此操作的示例,还提供了一个示例项目:redirect stdoutput

编辑:好吧,再次阅读你的问题,我明白你的问题在于控制台程序,而不是调用应用程序。我想知道您的控制台应用程序需要什么,通常控制台应用程序知道何时需要输入,并且在用户输入此信息之前无法继续执行。你需要检查出口吗?

答案 3 :(得分:0)

对于Stream,如果你.Read()函数结果是读取的字节数,如果没有任何内容,即使你要求更多,也将为零。从Delphi帮助Classes.TStream.Read:

  

读取用于从流中读取的字节数不一定固定的情况。它尝试将Count字节读入缓冲区并返回实际读取的字节数。