【发布时间】:2018-11-03 23:11:20
【问题描述】:
每次点击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 不能 在创建窗口句柄之前调用控件。'
【问题讨论】:
-
任何涉及显示的事情都只能发生在 UI 线程中(这就是您需要 Invoke 的原因)。那么,为什么要使用线程?另外:您使用
Graphics g = pictureBox1.CreateGraphics();绘制的任何内容都不会保留。更多错误可能在Move代码中,但我们看不到。 -
小格式类型,
<br>在此站点上没有任何作用。如果你想换行,你必须连续输入两次。 -
每次打电话
new Thread(...)都会有一个小疯子。创建线程的计算成本很高,占用 1MB 的 RAM,而且速度很慢。只有当您即将执行 CPU 密集型操作时,优势才会出现。您的代码似乎并非如此。
标签: c# multithreading picturebox