我知道我可以使用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. C - 读取用户输入
- 3. 不幸停止应用程序停止
- 4. 停止用户输入'char
- 5. 停止*作为用户输入输入
- 6. c编程语言:应用程序不会停止后输入x
- 7. 停止应用程序,而退出应用程序
- 8. Python - 程序停止读取标准输入
- 9. 获取用户输入并在需要时停止循环C
- 10. C读取用户输入的数据
- 11. 当用户进入停止“输入”键
- 12. C#单控制台应用程序停止输出,如果没有键输入
- 13. 想要停止使用SetWindowsHookEx读取后进入OS /应用程序的数据
- 14. C#应用程序停止工作
- 15. 当用户输入时,程序需要停止209,312,414
- 16. 让用户输入一个值后程序停止
- 17. 读取用户输入:: cin.get
- 18. 从用户读取输入
- 19. “应用程序....已经意外停止”读取文件
- 20. 从Sqlite读取行时应用程序停止
- 21. 应用程序已停止
- 22. 停止用户输入到编辑框?
- 23. Android应用程序 - 不幸停止
- 24. 异常不停止应用程序
- 25. CGEventTap阻止应用程序输入
- 26. 使用C读取输入使用C
- 27. 如何停止读取输入并分析数据C
- 28. 从键盘获取输入而不暂停程序
- 29. C++输入不被读取
- 30. 不能停止程序崩溃用户输入的错误文件
当然,您希望应用程序处于准备好接受用户输入的状态,所以在按键时您可以执行一些功能。或者,这就像一个按钮取消处理? – jimplode 2010-10-14 08:18:42
是的,但很好的例子是一个游戏 - 你需要运行一些循环(敌人的运动,不管),但仍然注册播放器输入 – Ptr 2010-10-14 08:22:47