2

次のコードで入れ子になった Parallel.For ループを使用して、kinect 深度データをテキスト ファイルに書き込もうとしています。しかし、それは与えIndexOutofRangeExceptionます。

640x480単純な for ループを使用する場合、コードは完璧に機能しますが、深さの形式が に設定されているため、ループが307200 linesテキスト ファイルに書き込まれるため、UI がハングします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 ではないと思います。StreamWriter の一部の内部実装が原因でのみ、IndexOutofRangeException が表示されます。主な問題は、複数のスレッドから swDepth.WriteLine を使用していることです。これは、コードが通常の for では機能するのに、並列 for では失敗する理由を説明しています。

リンク 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 に答える