2

我正在尝试使用带有以下代码的嵌套 Parallel.For 循环将 kinect 深度数据写入文本文件。但是,它给出了IndexOutofRangeException.

如果使用简单的 for 循环,该代码可以完美运行,但它会挂起 UI,因为深度格式设置为640x480导致循环写入307200 lines文本文件中的30fps.

因此,我切换到并行。对于方案。如果我从嵌套循环中省略 writeLine 命令,则代码可以正常工作,这表明IndexOutofRangeException在 writeline 命令中出现了。我不知道如何解决这个问题。请指教。

有没有更好的解决方法来避免 UI 冻结?

谢谢。

using (DepthImageFrame depthImageframe = d.OpenDepthImageFrame())
            {
                if (depthImageframe == null)
                    return;
                depthImageframe.CopyPixelDataTo(depthPixelData);

                swDepth = new StreamWriter(@"E:\depthData.txt", false);
                int i = 0;

                Parallel.For(0, depthImageframe.Width, delegate(int x)
                {
                    Parallel.For(0, depthImageframe.Height, delegate(int y)
                    {
                        p[i] = sensor.MapDepthToSkeletonPoint(depthImageframe.Format,
                                x, y, depthPixelData[x + depthImageframe.Width * y]);
                        swDepth.WriteLine(i + "," + p[k].X + "," + p[k].Y + "," + p[k].Z);
                        i++;
                    });
                });            

                swDepth.Close();

            }
        }
4

1 回答 1

4

我认为问题不在于 IndexOutofRange。您看到 IndexOutofRangeException 只是因为 StreamWriter 的一些内部实现。主要问题是您从多个线程中使用 swDepth.WriteLine。这就解释了为什么您的代码适用于普通 fors,但无法使用并行 fors。

检查链接 http://msdn.microsoft.com/en-us/library/system.io.streamwriter.aspx。它说只有 StreamWriter 的静态成员是线程安全的。

要解决这个问题,只需更换

swDepth.WriteLine(i + "," + p[k].X + "," + p[k].Y + "," + p[k].Z);

lock(someSyncObject)
    swDepth.WriteLine(i + "," + p[k].X + "," + p[k].Y + "," + p[k].Z);

还要确保 sensor.MapDepthToSkeletonPoint 可以在多个线程中工作。

于 2012-11-04T13:04:50.747 回答