每次点击时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 回答
![?](http://img1.sycdn.imooc.com/5458506b0001de5502200220-100-100.jpg)
汪汪一只猫
TA贡献1898条经验 获得超8个赞
第一辆车停下来,因为 br 增加了,并且 Draw 函数现在移动列表中的第二辆车。
如果多次单击图片框,将有多个线程运行 Draw 函数,并且它们都在移动同一辆车(参见 1.)
当窗体关闭并且线程仍在运行时,线程会尝试访问图片框。它可能不再存在。
解决方案
将 br 设为局部变量并将 br 作为参数传递给 thread.Start() 方法。
应由 1 固定。
在窗体的 OnClosing 中停止所有线程
- 2 回答
- 0 关注
- 124 浏览
添加回答
举报
0/150
提交
取消