我知道我可以使用ReadKey,但它会冻结应用程序,直到用户按下一个键。是否有可能(在控制台应用程序)有一些循环运行,仍然能够作出反应?我只能想到事件,但不知道如何在控制台中使用它们。 我的想法是循环会在每次迭代期间检查输入。c#读取用户输入而不停止应用程序
6
A
回答
7
他们的方式我这样做对我自己的应用程序是有一个专门的线程调用到System.Console.ReadKey(true)
并提出按键(以及任何其他事件)到消息队列。
然后,主线程在一个循环中(以类似于Win32应用程序中的主循环的方式)服务此队列,确保呈现和事件处理全部在单个线程上处理。
private void StartKeyboardListener()
{
var thread = new Thread(() => {
while (!this.stopping)
{
ConsoleKeyInfo key = System.Console.ReadKey(true);
this.messageQueue.Enqueue(new KeyboardMessage(key));
}
});
thread.IsBackground = true;
thread.Start();
}
private void MessageLoop()
{
while (!this.stopping)
{
Message message = this.messageQueue.Dequeue(DEQUEUE_TIMEOUT);
if (message != null)
{
switch (message.MessageType)
{
case MessageType.Keyboard:
HandleKeyboardMessage((KeyboardMessage) message);
break;
...
}
}
Thread.Yield(); // or Thread.Sleep(0)
}
}
+0
嗯,我看到了,所以我想不是那么简单的方法。谢谢 – Ptr 2010-10-14 08:20:04
1
让循环运行在单独的线程中。
class Program
{
private static string input;
public static void Main()
{
Thread t = new Thread(new ThreadStart(work));
input = Console.ReadLine();
}
private static void work()
{
while (input == null)
{
//do stuff....
}
}
}
相关问题
- 1. 使用C++获取用户输入而不停止程序
- 2. 停止应用程序盗取输入
- 3. 停止应用程序被终止,而不输入正确的密码? c#
- 4. C程序停止响应大输入
- 5. 停止程序的流程直到用户输入文本(c#)
- 6. C - 读取用户输入
- 7. 在不停止执行的情况下读取用户输入
- 8. 如何在没有输入时让程序停止阅读用户输入?
- 9. C - scanf没有停止用户输入
- 10. 不幸停止应用程序停止
- 11. 停止在用户输入
- 12. 停止用户输入'char
- 13. 停止*作为用户输入输入
- 14. c编程语言:应用程序不会停止后输入x
- 15. 应用程序意外停止,而
- 16. 停止应用程序,而退出应用程序
- 17. 程序不会停止读取文件
- 18. ANTLR程序停止读取输入文件
- 19. Python - 程序停止读取标准输入
- 20. 获取用户输入并在需要时停止循环C
- 21. C++ - 读取和比较用户输入?
- 22. C读取用户输入的数据
- 23. 的Xcode/LLDB:在进入停止应用程序,而不符号分成程序
- 24. 程序从用户读取,然后停止
- 25. C#单控制台应用程序停止输出,如果没有键输入
- 26. C#TPL应用程序停止运行
- 27. 当用户进入停止“输入”键
- 28. C#停止用户输入一个字符/字符串,而不是整数
- 29. 想要停止使用SetWindowsHookEx读取后进入OS /应用程序的数据
- 30. 何时停止读取telnet输入?
当然,您希望应用程序处于准备好接受用户输入的状态,所以在按键时您可以执行一些功能。或者,这就像一个按钮取消处理? – jimplode 2010-10-14 08:18:42
是的,但很好的例子是一个游戏 - 你需要运行一些循环(敌人的运动,不管),但仍然注册播放器输入 – Ptr 2010-10-14 08:22:47