2010-10-14 27 views
6


Tôi biết tôi có thể sử dụng ReadKey cho điều đó nhưng ứng dụng sẽ đóng băng cho đến khi người dùng nhấn một phím. Có thể (trong giao diện điều khiển ứng dụng) để có một số vòng lặp chạy và vẫn có thể phản ứng? Tôi chỉ có thể nghĩ về các sự kiện nhưng không chắc chắn cách sử dụng chúng trong bảng điều khiển. Ý tưởng của tôi là vòng lặp sẽ kiểm tra đầu vào trong mỗi lần lặp.C# đọc đầu vào của người dùng mà không cần dừng ứng dụng

+0

Chắc chắn bạn muốn ứng dụng ở trạng thái sẵn sàng chấp nhận đầu vào của người dùng, vì vậy, nhấn phím bạn có thể thực hiện một số chức năng. Hoặc là điều này giống như một nút bấm để hủy bỏ chế biến ?? – jimplode

+0

Có nhưng ví dụ tuyệt vời là một trò chơi - bạn cần phải chạy một số vòng lặp (chuyển động của đối phương, bất cứ điều gì) nhưng vẫn đăng ký đầu vào người chơi – Ptr

Trả lời

7

Họ cách tôi đã làm điều này cho các ứng dụng của riêng tôi là để có một sợi chuyên dụng mà các cuộc gọi vào System.Console.ReadKey(true) và đặt các phím bấm (và bất kỳ sự kiện khác) vào một hàng đợi thông điệp.

Chuỗi chính sau đó dịch vụ hàng đợi này trong một vòng lặp (theo cách tương tự với vòng lặp chính trong ứng dụng Win32), đảm bảo việc xử lý sự kiện và hiển thị được xử lý trên một chuỗi đơn.

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

Hmm Tôi thấy, vì vậy tôi đoán không có cách nào dễ dàng như thế. Cảm ơn – Ptr

1

Có vòng lặp chạy trong chuỗi riêng biệt.

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....  
    } 
    } 
} 
Các vấn đề liên quan