2010-04-26 68 views
2

對於控制檯應用程序,我需要知道如何在設定的時間量(約10秒)內等待用戶輸入一個或一組密鑰,然後才能繼續應用程序的「自動運行」部分。用戶輸入的等待設置時間C#控制檯應用程序

這是在煩我,因爲我無法弄清楚計時器是如何工作的,或threading.sleep,我該用什麼?一直使用Google搜索。

一些僞代碼:

1.app打開

2.app等待10秒爲用戶打 「K」 鍵。

3.如果用戶點擊K,去4.如果用戶不,去5

4.run函數(打開一個表格)

5.run功能(做某事)

我打賭它很簡單,我只是不明白髮生了什麼事情。

+0

什麼樣的程序?的WinForms? – SLaks 2010-04-26 15:32:58

+0

這是一個控制檯應用程序還是一個win-forms應用程序? – 2010-04-26 15:33:14

+0

請詳細解釋一下。 「自動運行」是什麼意思?你可以舉一些關於應用程序應該如何表現的例子嗎? – Shoban 2010-04-26 15:40:27

回答

3

關閉10秒定時器。

定時器到期時觸發事件。

在事件處理程序中繼續執行「自動運行」部分。

如果用戶在計時器到期之前點擊某個鍵,則殺死該線程。

MSDN上的Timer class page有一個計時器等待設定時間的例子。

+0

行。我想這可能有幫助!我的大腦 – Marlon 2010-04-26 17:59:43

+0

現在好了我需要在定時器期間讀取輸入鍵的位置。我有一段時間(關鍵不等於'K')循環。我應該有這個嗎?我喜歡,現在編程便祕.. – Marlon 2010-04-26 18:04:55

+0

@Marlon - 這將工作,但沒有必要。有一個按鍵處理程序,並在用戶按下「K」鍵停止線程。 – ChrisF 2010-04-26 19:33:43

0

這裏有一些代碼也可以幫助你。

 Form1 f = new Form1(); 
     System.Threading.Timer t = new System.Threading.Timer(o => f.Invoke(new Action(() => f.textBox1.Enabled = true)), null, 10000, System.Threading.Timeout.Infinite); 
     f.ShowDialog(); 
     t.Change(System.Threading.Timeout.Infinite, System.Threading.Timeout.Infinite); 
+0

謝謝你的回答。但在分配的時間內,我沒有看到你判斷用戶輸入的位置。也許我應該改變一下我的問題。 :( – Marlon 2010-04-26 17:52:39

+0

是的,這個問題現在已經很清楚了,我的回答並不是解決問題的編輯方式 – 2010-04-27 15:12:00

1

可能的答案here如果您使用的是控制檯應用程序。

+0

喲我很愚蠢,我不明白你鏈接的代碼是怎麼工作的。你可以向我解釋一下嗎? – Marlon 2010-04-26 17:50:02

+0

基本上 - 問題是即使你在一個線程上啓動它,然後殺死那個線程,微軟的控制檯也會永遠阻塞 - 控制檯是每個進程。有2個可執行文件:第一個是一個簡單的readline,它回顯到控制檯,另一個調用線程上某個線程在給定秒數後超時。如果在客戶端輸入內容之前達到超時,則該應用程序終止並返回一個默認的(如果給定的)字符串,這有幫助嗎? – 2010-04-26 18:19:49

7

以下是C#控制檯應用程序的一些示例代碼。它不使用計時器,而是使用睡眠。它比基於定時器的代碼更容易理解。

 static void openForm() 
     { 
      Console.WriteLine("Form opened!"); 
     } 

     static void doSomething() 
     { 
      Console.WriteLine("Do something!"); 
     } 

     static void Main(string[] args) 
     { 
      bool optionForm = false; 
      int seconds = 1; 

      Console.Write("Press 'k' to open form"); 

      while (true) 
      {     
       if (Console.KeyAvailable) 
       { 
        ConsoleKeyInfo c = Console.ReadKey(true); 
        if (c.Key == ConsoleKey.K) 
        {       
         optionForm = true; 
         break; 
        } 
       } 

       System.Threading.Thread.Sleep(1000); 

       if (seconds++ > 10) 
        break; 

       Console.Write('.'); 
      } 

      Console.WriteLine(); 

      if (optionForm) 
       openForm(); 
      else 
       doSomething(); 

      Console.ReadKey(); 
     } 
+0

我最終使用了定時器,但這看起來不錯,我投了票。 – Marlon 2010-04-29 13:18:12

1

感謝馬龍!這真的幫了我很多..

我用下面的代碼:

int minutes = 1; 
while (true) 
{ 
    if (Console.KeyAvailable) 
    { 
     ConsoleKeyInfo c = Console.ReadKey(true); 
    if (c.Key == ConsoleKey.Enter) 
    { 
      break; 
    } 
    } 
    Thread.Sleep(1000); 
    if (minutes++ > 10) 
    { 
    throw; 
    } 
} 
相關問題