我知道我可以使用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