使用线程使对象移动

每次点击时pictureBox,我都会在列表中添加类型为的对象Car。我想让它们一点击就移动picutreBox。


这是我的代码


private Thread t;

private void pictureBox1_MouseClick_1(object sender, MouseEventArgs e)

{                

    list.Add(new Car(e.X, e.Y, 40, 40));

    br++;

    t = new Thread(Draw);

    t.Start();  

}

画:


private void Draw()

{

    Graphics g = pictureBox1.CreateGraphics();           

    for(int i = 0; i < 1000; i++)

    {

        list[br].DrawCar(g, Color.Red);

        list[br].Move();               

        Thread.Sleep(100);

        pictureBox1.Invoke(

            (MethodInvoker)delegate

            {

                pictureBox1.Refresh();

            });

    }            

    g.Dispose();

}

我遇到的问题如下:

  1. 当我第一次点击时,它移动得很好,但是一旦我再次点击,汽车就会停下来,下一辆车开始移动。

  2. 我点击表单越多,汽车越快,我不知道为什么

  3. 当我退出表单时,出现异常:

System.InvalidOperationException: '在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke。'


慕娘9325324
浏览 125回答 2
2回答

汪汪一只猫

第一辆车停下来,因为 br 增加了,并且 Draw 函数现在移动列表中的第二辆车。如果多次单击图片框,将有多个线程运行 Draw 函数,并且它们都在移动同一辆车(参见 1.)当窗体关闭并且线程仍在运行时,线程会尝试访问图片框。它可能不再存在。解决方案将 br 设为局部变量并将 br 作为参数传递给 thread.Start() 方法。应由 1 固定。在窗体的 OnClosing 中停止所有线程
打开App,查看更多内容
随时随地看视频慕课网APP