我试图在一个表单上绘制大约3600个点,使用一个线程很慢,所以我决定要使用4个线程。
在我的代码中,我将3600点分为4个线程,他们应该绘制它。但是由于某种原因,抛出了ArgumentOutOfRangeException。 我试图调试我的代码,但我找不到错误。
这是代码:
(忽略类_3DPoint,它只是一个包含x,y,z值的点。当我绘制它们时,我只使用x,y值。)
绘制积分的代码:
public Graphics g; //g = this.CreateGraphics() in form1.Load()
public void drawrectangle(_3DPoint)
float xCord = float.Parse(p.x.ToString());
float yCord = float.Parse(p.y.ToString());
Brush b = new SolidBrush(Color.White);
xCord = lsize * xCord + center.X;
yCord = lsize * yCord + 10 + center.Y;
g.FillRectangle(b, xCord, yCord, 2, 2);
}
lsize,center只是用于根据我的需要对齐点的变量。
所有多线程操作代码:
public List<_3DPoint[]> multiThreadsdata = new List<_3DPoint[]>();
public void handlemultithread(_3DPoint[] P)
{
g.Clear(Color.Black);
for (int i = 0; i < multiThreads.Length; i++)
{
multiThreadsdata.Add(new _3DPoint[P.Length / multiThreads.Length]);
}
for (int i = 0; i < multiThreads.Length; i++)
{
for (int j = (P.Length / multiThreads.Length) * (i); j < (P.Length / multiThreads.Length) * (i + 1); j++)
{
multiThreadsdata[i][j - ((P.Length / multiThreads.Length) * i)] = new _3DPoint(P[j]);
}
}
for (int i = 0; i < multiThreads.Length; i++)
{
multiThreads[i] = new Thread(() => drawPoints(multiThreadsdata[i]));
multiThreads[i].Start();
}
}
delegate void SetCallBackPoint(_3DPoint location);
public void drawPoints(_3DPoint[] locations)
{
for (int i = 0; i < locations.Length; i++)
{
if (this.InvokeRequired)
{
SetCallBackPoint e = new SetCallBackPoint(drawrectangle);
this.Invoke(e, new object[] { locations[i] });
}
else
{
drawrectangle(locations[i]);
}
}
}
P
是一个_3DPoint数组,包含所有3600个点。
mutliThreads
是一个包含4个线程的Thread []。
我在handlemultithread
方法中获得了异常。在这个for
循环的第三行:
for (int i = 0; i < multiThreads.Length; i++)
{
multiThreads[i] = new Thread(() => drawPoints(multiThreadsdata[i])); // <- here.
multiThreads[i].Start();
}
我不知道是什么问题,我的猜测是多线程存在一些问题,因为我只是一个多线程的初学者。
非常感谢。
答案 0 :(得分:1)
当您在评论中应用建议时,完全可以在表单上快速绘制3600个矩形。
如果这没有给你足够的时间,你可以考虑在单个后台线程上创建图像,将它们存储在某种缓冲区中,直到需要在Graphics
对象上绘制它们{1}}表格的事件。只有你能够预先了解下一帧需要绘制的内容时,这才是可行的。
此示例使用一个简单的Background worker来为ConcurrentQueue
填充图像。代码中的注释解释了发生了什么。
Paint
请记住,当你有一个CPU繁重的进程时,添加更多线程将不会通过魔法使你的方法运行得更快。你甚至可能会让情况变得更糟:更多线程在CPU上争夺时间。