【问题标题】:Wait set time for user input C# console app等待用户输入 C# 控制台应用程序的设置时间
【发布时间】:2011-02-12 11:15:32
【问题描述】:

对于控制台应用程序,我需要知道如何在设定的时间(大约 10 秒)等待用户输入一个或一组键,然后再继续应用程序的“自动运行”部分.

这让我很烦,因为我不太清楚计时器是如何工作的,或者 threading.sleep,我应该使用什么?整天在谷歌上搜索。

一些伪代码:

1.app打开

2.app 等待 10 秒让用户按下“k”键。

3.如果用户点击k,转到4。如果用户没有,转到5。

4.运行一个函数(打开一个表单)

5.运行一个函数(做某事)

我打赌它很简单,我只是不明白发生了什么。

【问题讨论】:

  • 什么样的程序? WinForms?
  • 这是控制台应用还是 win-forms 应用?
  • 请解释更多信息。 “自动运行”是什么意思?你能举一些关于应用程序应该如何表现的例子吗?
  • 奇怪的 UI 设计。如果用户打喷嚏并需要 11 秒才能完成输入会怎样?
  • 它是一个控制台应用程序。对不起,让我改变我的问题。 thx 寻找。另外,通过自动运行,我的意思是自动继续应用程序。

标签: c# user-input wait


【解决方案1】:

关闭 10 秒定时器。

当计时器到期时触发一个事件。

在事件处理程序中继续“自动运行”部分。

如果用户在计时器到期之前按下键,则终止线程。

MSDN 上的Timer class page 有一个计时器等待设定周期的示例。

【讨论】:

  • 好的。我认为这可能有所帮助!我的大脑
  • 好的,现在我需要在计时器期间读取输入密钥的部分。我有一个 WHILE(键不等于 'K')循环。我应该有这个吗?我喜欢,现在就编程便秘..
  • @Marlon - 这可行但不是必需的。如果用户按下“K”,则有一个按键处理程序并在其中停止线程。
  • 好的,我做到了。没有代码示例,但我将此标记为答案。谢谢!
【解决方案2】:

这里有一些代码也可以帮你解决问题。

        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);

【讨论】:

  • 感谢您的回答。但我看不到您在分配的时间内在哪里判断用户的输入。也许我应该稍微改变一下我的问题。 :(
  • 是的。这个问题现在更清楚了。我的答案不是已编辑问题的解决方案。
【解决方案3】:

以下是 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();
        }

【讨论】:

  • 我最终使用了计时器,但这看起来很棒。我投了赞成票。
【解决方案4】:

谢谢马龙!!这对我帮助很大..

我使用了以下代码:

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;
   }
}

【讨论】:

  • 不是分钟而是秒,我从来没有在catch 之外看到过唯一的throw
猜你喜欢
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 2011-08-27
  • 1970-01-01
  • 1970-01-01
  • 2015-12-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多