2013-05-13 86 views
1

我有一个应用程序生成大约20秒的随机数字,并在屏幕上的标签中随时显示随机数字。C#减速随机数字GUI显示

我想在同一个标​​签上显示数字,但在停止过程之前减慢数字的显示,例如5秒钟,数字的显示应该越来越平稳地减慢,直到停止在最后数。就像抽奖一样。

任何线索?

+1

因此,您正在寻找一种“老虎机”的样子,一堆数字经过,速度放慢,直到一个被选中? – Matthew 2013-05-13 19:01:18

+0

完全像老虎机效果! – VAAA 2013-05-13 19:01:58

+1

只需使用Timer()并随时更改Interval()。一些基本的计算会告诉你在每个间隔()中应该生成多少个数字,以最终总计时间为期望的数量... – 2013-05-13 19:05:36

回答

12

我可以先告诉你不是做的。不要使用Thread.Sleep - 这样做几乎总是“最糟糕的做法”,并且会让您的用户界面无法响应。

如果您在第二个线程上使用Thread.Sleep,正如mcl所建议的那样,您不会冻结您的UI,但是您正在烧制一个非常昂贵的线程来完成很少的工作。

如果您使用的是C#4或更早的版本,那么我会创建一个计时器设置为每秒四次打勾。处理tick事件,如果自上次tick事件以来已经过了足够的时间,请更改标签。或者,每次滴答时更改定时器的时间间隔。

如果您正在使用C#5,你可以用await Task.Delay(x)

async void Animate() 
{ 
    int delay = 5; 
    for(int i = 1; i < 10; ++i) 
    { 
     UpdateLabel(); 
     await Task.Delay(delay); 
     delay = delay * 2; 
    } 
} 

所以,现在你开始了5ms的延迟,然后10,然后20 ......

1

考虑在不同的线程上生成这些数字。您可以为此使用BackgroundWorker,并在生成每个数字时报告进度。当你开始到达最后时,使用Thread.Sleep(毫秒)来“减慢”(freez)BackgroundWorker的作业线程,该线程正在生成指定数量的毫秒的数字,并随着您的最终数字增加这些毫秒。这应该够了吧。

http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx

设置BackgroundWorker的报告进度,并用它来“推动”生成的数字到UI线程。 您也可以从工具箱中将BackgroundWorker组件拖放到表单上。

2

这里有一个工作程序让你开始。它将FormText快速更改3秒,之后变慢。这是通过使用一个Timer开始减速Timer来实现的,它显示了随机数。

public partial class Form1 : Form 
{ 
    System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer() { Interval = 10 }; 
    System.Windows.Forms.Timer timerForStartingSlowDown = new System.Windows.Forms.Timer() { Interval = 3000 }; 
    bool slow = false; 
    Random random = new Random(); 

    public Form1() 
    { 
     InitializeComponent(); 
     timer.Tick += timer_Tick; 
     timerForStartingSlowDown.Tick += timerForStartingSlowDown_Tick; 
     Shown += Form1_Shown; 
    } 

    void timerForStartingSlowDown_Tick(object sender, EventArgs e) 
    { 
     slow = true; 
     timerForStartingSlowDown.Enabled = false; 
    } 

    void Form1_Shown(object sender, EventArgs e) 
    { 
     timer.Enabled = true; 
     timerForStartingSlowDown.Enabled = true; 
    } 

    void timer_Tick(object sender, EventArgs e) 
    { 
     if (timer.Interval > 350) timer.Enabled = false; 
     else 
     { 
      if (slow) timer.Interval += 10; 
      Text = random.Next(1, 100).ToString(); 
     } 
    } 
}