描画領域に一連の長方形を印刷するデスクトップ アプリケーションを構築しています。このアプリケーションは、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 ();
}
);
}
);
}