【问题标题】:Showing Timer on screen and asking for user input at the same time?在屏幕上显示计时器并同时要求用户输入?
【发布时间】:2013-10-09 18:34:24
【问题描述】:

我正在开发一个 c# 控制台应用程序。

我必须在屏幕上的指定光标位置显示一个计时器,同时用户应该输入一些东西。

我该怎么做?

Console.SetCursorPosition(x, y);
//timer code here
Console.SetCursorPosition(x, y); // cursor goes to some other location because timer is displayed at top-right of the screen.

我的问题是这个方法不同步。 我必须等到光标移到那个位置然后显示时间然后回来才能打字。

【问题讨论】:

  • 您说您正在开发一个控制台应用程序,但您已将其标记为asp.net。解释一下?
  • My problem is that this method isn't synchronized这是什么意思?
  • 你能再贴一些代码吗?例如,用户输入的位置。发布 x 和 y 的实际值也会有所帮助。
  • 我会尽力解释的。我在控制台应用程序中添加了一个计时器。这是一张照片它的外观。 i.imgur.com/Ckl9ADG.png 我正在使用 Console.SetCursorPosition 来显示计时器(每秒更新一次)。然后,我切换回用户输入答案的区域。现在收到了吗?
  • 我明白你的意思。看看这个:stackoverflow.com/questions/5772203/…。从那个链接来看,这似乎不是一项简单的任务。

标签: c#


【解决方案1】:

即使在阅读一行时,您也可以使用Timer。请参阅下面的代码以获取工作示例:

class Program
{
    private static System.Timers.Timer _timer;

    static void Main( string[] args )
    {

        _timer = new System.Timers.Timer( 1000 );
        _timer.Elapsed += Timer_Elapsed;
        _timer.AutoReset = true;
        _timer.Start();

        Console.CursorLeft = 0;
        Console.CursorTop = 5;
        // Type something here...
        var l_readline = Console.ReadLine();
        // Print it out... (to show it correctly reads the input)
        Console.WriteLine( l_readline );
        Console.ReadKey( true );
    }

    private static void Timer_Elapsed( object sender, System.Timers.ElapsedEventArgs e )
    {
        int l_left = Console.CursorLeft;
        int l_top = Console.CursorTop;

        Console.CursorLeft = 0;
        Console.CursorTop = 0;
        Console.Write( DateTime.Now.ToLongTimeString() );
        Console.CursorLeft = l_left;
        Console.CursorTop = l_top;
    }

}

只要在完成后将光标位置重置回原来的位置,我认为大多数形式的输入不会有太大问题。

【讨论】:

  • 这是来自 Dr. Who 的 Cyberman
  • 谢谢您,先生。希望我能代表你,但不能。
【解决方案2】:

处理此类事情的最简单方法是存储当前的Cursor(X, Y),将时间写入您的Time(X, Y),然后将光标设置回 Cursor(X, Y)

private const int TIME_LEFT = 40;
private const int TIME_RIGHT = 2;

private void WriteTime() {
  var left = Console.CursorLeft;
  var right = Console.CursorTop;
  try {
    Console.SetCursorPosition(TIME_LEFT, TIME_RIGHT);
    Console.Write(DateTime.Now);
  } finally {
    Console.SetCursorPosition(left, right);
  }
}

不知道你在做什么,这是我给你最好的建议。

这应该比人类反应更快。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-01
    • 2020-09-20
    • 2018-06-19
    • 1970-01-01
    • 1970-01-01
    • 2013-10-16
    • 2023-01-25
    相关资源
    最近更新 更多