C#sleep暂停时间越来越小

时间:2021-06-20 05:45:03
代码很简单 就是在一个窗口里画一个圈,然后控制他移动。但是开始移动时很慢,然后越来越快,越来越快。
        int x=20;
        int y=20;
        private void Form1_Paint( object sender , PaintEventArgs e )
        {
            Graphics g = e.Graphics;
            Pen p = new Pen(Color.Red);
            g.DrawEllipse(p , x , y , 20 , 20);
            Thread t = new Thread(run);
            t.IsBackground = true;
            t.Start();
        }


        private void run()
        {
            while( true )
            {
                //x++;
                y++;
                if( y > 400 )
                {
                    y = 0;
                }
                Thread.Sleep(30);
                this.Invalidate();
            }
        }

4 个解决方案

#1


窗口显示时启动了Form1_Paint事件
Form1_Paint事件中启动了另一个线程,并在新的线程中执行this.Invalidate(),再一次触发了Form1_Paint事件,而Form1_Paint事件又启动一次新线程去执行Run,所以会越来越快

解决方法很简单,把run中的while(true)去掉就OK了


        int x=20;
        int y=20;
        private void Form1_Paint( object sender , PaintEventArgs e )
        {
            Graphics g = e.Graphics;
            Pen p = new Pen(Color.Red);
            g.DrawEllipse(p , x , y , 20 , 20);
            Thread t = new Thread(run);
            t.IsBackground = true;
            t.Start();
        }
        private void run()
        {
                y++;
                if( y > 400 )
                {
                    y = 0;
                }
                Thread.Sleep(30);
                this.Invalidate();
        }

#2


每一次画都启动一个线程, 线程越多当然就越快了.

#3


同意2楼,因为每个线程都去更新form,每次更新都启动新线程,所以会刷新的越来越快

#4


建议把线程放到其他函数中,而不是paint事件中

#1


窗口显示时启动了Form1_Paint事件
Form1_Paint事件中启动了另一个线程,并在新的线程中执行this.Invalidate(),再一次触发了Form1_Paint事件,而Form1_Paint事件又启动一次新线程去执行Run,所以会越来越快

解决方法很简单,把run中的while(true)去掉就OK了


        int x=20;
        int y=20;
        private void Form1_Paint( object sender , PaintEventArgs e )
        {
            Graphics g = e.Graphics;
            Pen p = new Pen(Color.Red);
            g.DrawEllipse(p , x , y , 20 , 20);
            Thread t = new Thread(run);
            t.IsBackground = true;
            t.Start();
        }
        private void run()
        {
                y++;
                if( y > 400 )
                {
                    y = 0;
                }
                Thread.Sleep(30);
                this.Invalidate();
        }

#2


每一次画都启动一个线程, 线程越多当然就越快了.

#3


同意2楼,因为每个线程都去更新form,每次更新都启动新线程,所以会刷新的越来越快

#4


建议把线程放到其他函数中,而不是paint事件中