2010-04-26 66 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; 
    } 
} 
相关问题