通过char / timer打印字符串char

时间:2015-06-19 10:36:21

标签: c# printing timer

我正在制作一个基于文本的游戏,我想慢慢地进行文本打印的介绍(char与char相差大约100ms)我试着制作一个循环遍历字符串并逐个打印字符,但我需要一个计时器,即使在谷歌的帮助下,我也无法实现。所以我需要帮助制作一个计时器或另一种算法,以便慢慢打印字符串。 我的代码:

static void PrintSlowly(string print)
{
    foreach(char l in print) {
        Console.Write(l);
        //timer here
    }
    Console.Write("\n");
}

2 个答案:

答案 0 :(得分:1)

令人讨厌,讨厌的廉价解决方案:

static void PrintSlowly(string print)
{
    foreach(char l in print) {
        Console.Write(l);
        Thread.sleep(10); // sleep for 10 milliseconds    
    }
    Console.Write("\n");
}

由于您可能不太关心性能,因此您可以使用此功能。但请记住Thread.Sleep is pretty wasteful

答案 1 :(得分:1)

根据apomene的解决方案,我选择基于(真实)定时器的解决方案,因为Thread.Sleep非常不精确。

static void PrintSlowly(string print)
{
    int index = 0;
    System.Timers.Timer timer = new System.Timers.Timer();

    timer.Interval = 100;
    timer.Elapsed += new System.Timers.ElapsedEventHandler((sender, args) =>
    {
        if (index < print.Length)
        {
            Console.Write(print[index]);
            index++;
        }
        else
        {
            Console.Write("\n");
            timer.Enabled = false;
        }
    });

    timer.Enabled = true;
}

定时器每100毫秒返回一次,选择下一个字符并打印出来。如果没有更多可用字符,则打印返回并禁用自身。我使用lambda表达式使用匿名处理方法编写它 - 不是最干净的方法。这只是原理。 此实现与您的应用程序并行运行,因此它不会阻止您的代码执行。如果你想要这样,一种不同的方法可能会更好。

或者 - 作为apomene解决方案的修改而无需忙碌等待 - 您可以使用ManualResetEvent

static System.Timers.Timer delay = new System.Timers.Timer();
static AutoResetEvent reset = new AutoResetEvent(false);

private static void InitTimer()
{
    delay.Interval = 100;
    delay.Elapsed += OnTimedEvent;
    delay.Enabled = false;
}

private static void OnTimedEvent(object sender, ElapsedEventArgs e)
{
    ((System.Timers.Timer)sender).Enabled = false;
    reset.Set();
}

static void PrintSlowly2(string print)
{
    InitTimer();

    foreach (char l in print)
    {
        Console.Write(l);
        delay.Enabled = true;

        reset.WaitOne();
    }
    Console.Write("\n");
}

它等待使用AutoResetEvent,因此其他应用程序/线程可以使用处理器!