试图绘制多线程矩形

时间:2016-07-15 13:56:14

标签: c# multithreading winforms

我试图在一个表单上绘制大约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();
        }

我不知道是什么问题,我的猜测是多线程存在一些问题,因为我只是一个多线程的初学者。

非常感谢。

1 个答案:

答案 0 :(得分:1)

当您在评论中应用建议时,完全可以在表单上快速绘制3600个矩形。

如果这没有给你足够的时间,你可以考虑在单个后台线程上创建图像,将它们存储在某种缓冲区中,直到需要在Graphics对象上绘制它们{1}}表格的事件。只有你能够预先了解下一帧需要绘制的内容时,这才是可行的。

此示例使用一个简单的Background worker来为ConcurrentQueue填充图像。代码中的注释解释了发生了什么。

Paint

请记住,当你有一个CPU繁重的进程时,添加更多线程将不会通过魔法使你的方法运行得更快。你甚至可能会让情况变得更糟:更多线程在CPU上争夺时间。