1

描画領域に一連の長方形を印刷するデスクトップ アプリケーションを構築しています。このアプリケーションは、MONO C# を使用して構築されています。

通常の「FOR」ループを使用しても問題はありません。期待どおりの結果が得られています。

フローは、通常のFORループを使用した場合の出力です

ここに画像の説明を入力

フローは、通常の Parallel.For ループを使用した場合の出力です

ここに画像の説明を入力

ご覧のとおり、いくつかの長方形が間にありません。

ConcurrentQueue を使用して、作成された長方形を保持し、同じ Queue を他の関数に渡して描画領域に印刷しています。

以下はコードです。

 public static void DrwaWall (DrawingArea drawArea, string compLevel)
    {
        house.Rectangle rect = new house.Rectangle ();
        house.DrawHouse DrawHouse = new house.DrawHouse ();
        ConcurrentQueue<house.Rectangle> WallHouseQ = new ConcurrentQueue<house.Rectangle> ();
        PointD p1, p2, p3, p4;
        p1 = new PointD (55, 250);
        p2 = new PointD (65, 250);
        p3 = new PointD (65, 90);
        p4 = new PointD (55, 90);
        rect = new house.Rectangle (p1, p2, p3, p4);
        WallHouseQ.Enqueue (rect);
        Parallel.For (0, 27, (i) => {
            p1.X += 10;
            p2.X += 10;
            p3.X += 10;
            p4.X += 10;
            rect = new house.Rectangle (p1, p2, p3, p4);
            Helper.wastetime (compLevel);
            WallHouseQ.Enqueue (rect);
            Gtk.Application.Invoke (delegate {
                if (drawArea == null)
                    return;
                Cairo.Context ct = Gdk.CairoHelper.Create (drawArea.GdkWindow);
                DrawHouse = new house.DrawHouse (ct, WallHouseQ);
                DrawHouse.DrawRectangles ("Wall");
                ((IDisposable)ct.Target).Dispose ();
                ((IDisposable)ct).Dispose ();
                }
            );
            }
        );
    }
4

1 に答える 1

6

// p1/変数はスレッド セーフではないためp2、既存の四角形の上に描画している可能性がありますp3p4

毎回インクリメントする代わりに、現在のインデックスに基づいて適切な場所を計算できます。例えば:

Parallel.For(0, 27, i =>
{
    // Make new points...
    PointD p1New = new PointD(55 + (i+1)*10, 250);
    //...

    // Make sure you don't share variables here, either - ie: make a new rect from the new points
    house.Rectangle rectNew = new house.Rectangle (p1New, p2New, p3New, p4New);
于 2012-09-18T17:58:27.120 に答える