为了账号安全,请及时绑定邮箱和手机立即绑定

使用线程使对象移动

使用线程使对象移动

C#
慕娘9325324 2021-06-27 17:27:11
每次点击时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();}我遇到的问题如下:当我第一次点击时,它移动得很好,但是一旦我再次点击,汽车就会停下来,下一辆车开始移动。我点击表单越多,汽车越快,我不知道为什么当我退出表单时,出现异常:System.InvalidOperationException: '在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke。'
查看完整描述

2 回答

?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

  1. 第一辆车停下来,因为 br 增加了,并且 Draw 函数现在移动列表中的第二辆车。

  2. 如果多次单击图片框,将有多个线程运行 Draw 函数,并且它们都在移动同一辆车(参见 1.)

  3. 当窗体关闭并且线程仍在运行时,线程会尝试访问图片框。它可能不再存在。

解决方案

  1. 将 br 设为局部变量并将 br 作为参数传递给 thread.Start() 方法。

  2. 应由 1 固定。

  3. 在窗体的 OnClosing 中停止所有线程


查看完整回答
反对 回复 2021-07-03
  • 2 回答
  • 0 关注
  • 124 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信