繁体   English   中英

C#中的计时器问题

[英]Issues with Timers in C#

因此,我有一个计时器,每次运行时都会更改图片框中的图像。 我生成了一个随机数,具体取决于它是多少,它将停止在该图像上。 因此,计时器最初会第一次正常运行,它将在没有问题的正确图像上停止。 第二次通过故障和错误,第三次在大约1秒后停止,第四次冻结。 我不明白的是,计时器第一次如何才能完美工作并被停止(我认为这会重置计时器),然后第二次按下按钮再次激活计时器,它又变得混乱了?

这是我的一些代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Timers;
using System.Windows.Forms;

namespace WheelOfFortune
{
public partial class f : Form
{
    private static Random r = new Random();
    private static int spin = 0;
    private static int t1 = 0;
    private static int t2 = 0;
    private static int t3 = 0;
    private static int rn = 0;
    private static System.Timers.Timer st = new System.Timers.Timer();

    public f()
    {
        InitializeComponent();

    }

    private void Wheel_Click(object sender, EventArgs e)
    {

    }

    private void Spin_Click(object sender, EventArgs e)
    {          
        if (spin == 0) {
            t1 = 0;
            t2 = 0;
            t3 = 0;
            spin = 1;
            rn = r.Next(1, 53);
            Console.WriteLine("" + rn);
            st.Stop();
            st.Elapsed += new ElapsedEventHandler(OnTimedEvent);
            st.Interval = 15;
            st.Start();
        }

    }

    private static void OnTimedEvent(object source, ElapsedEventArgs e)
    {
        t1 = t1 + 6;
        if (t1 == 1)
        {
            Wheel.Image = Properties.Resources.Wheel_Test_0001;
        }
        else if (t1 == 2)
        {
            Wheel.Image = Properties.Resources.Wheel_Test_0002;
        }
        else if (t1 == 3)
        {
            Wheel.Image = Properties.Resources.Wheel_Test_0003;
        }
        else if (t1 == 4)
        {
            Wheel.Image = Properties.Resources.Wheel_Test_0004;
        }
        else if (t1 == 5)
        {
            Wheel.Image = Properties.Resources.Wheel_Test_0005;
        }
        else if (t1 == 6)
        {
            Wheel.Image = Properties.Resources.Wheel_Test_0006;
        }
        else if (t1 == 7)
        {
            Wheel.Image = Properties.Resources.Wheel_Test_0007;
        }
        else if (t1 == 8)
        {
            Wheel.Image = Properties.Resources.Wheel_Test_0008;
        }
        else if (t1 == 9)
        {
            Wheel.Image = Properties.Resources.Wheel_Test_0009;
        }
        else if (t1 == 10)
        {
            Wheel.Image = Properties.Resources.Wheel_Test_0010;
        }
        else if (t1 == 11)
        {
            Wheel.Image = Properties.Resources.Wheel_Test_0011;
        }
        else if (t1 == 12)
        {
            Wheel.Image = Properties.Resources.Wheel_Test_0012;

            if(rn == 2)
            {
                t2 = t2 + 1;
                if (t2 == 1)
                {
                    t3 = t3 + 1;
                    if (t3 == 4)
                    {
                        spin = 0;
                        t3 = 0;
                        t1 = 0;

                        st.Stop();
                    }
                    t2 = 0;
                }

            }
        }

此后,代码会重复执行,因为有624张图片要经过,一开始就一次跳过6张,然后会逐渐变慢。 (我还没有实现减速部分)。

我只是似乎看不到计时器不重置并再次执行相同操作的原因,我错过了什么吗?

您是否知道可以使用资源管理器来减少代码量。

ResourceManager _resourceManager= Resources.ResourceManager;
...

计时器事件

 string _imageName=SomeLeftPaddFunction(4,"0",t1);//function to always pad to 4 0's
 Wheel.Image = (Bitmap)_resourceManager.GetObject("Wheel_Test_"+_imageName);

缓存图像

public class ImageCacheItem
{
    int Index{get;set;}
    Bitmap Image{get;set;}
} 
...
List<ImageCacheItem> _imageCache=new List<ImageCacheItem>();
....

计时器事件

Wheel.Image=_imageCache.Where(p=>p.Index==t1).FirstOrDefault();
if(Wheel.Image==null)
{ 
    string _imageName=SomeLeftPaddFunction(4,"0",t1);//function to always pad to 4 0's
    _imageCache.Add(new {Index=t1,Image=(Bitmap)_resourceManager.GetObject("Wheel_Test_"+_imageName);
    Wheel.Image=_imageCache.Where(p=>p.Index==t1).First();

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM