1

Delphi XE でマルチスレッドを使用しようとしています。タスクは次のとおりです。4 つのスレッドを作成する必要があります。各スレッドは、ペイントボックスの事前定義された領域に色付きの円を描画します。たとえば、最初のスレッドはペイントボックスの最初のクォーターに赤い円のみを描画し、2 番目のスレッドは 2 番目のクォーターに黄色の円のみを描画します。

次のクラスを定義しました

const
  NumberOfIterations = 100000;
  NumberOfTreads = 4;

TCalcThread = class(TThread)
private
  FIdx: Integer;
  FHits: Cardinal;
  V: array of Integer;
  xPaintBox1: TPaintBox;
protected
  procedure Execute; override;
public
  constructor Create(Idx: Integer; vPaintBox: TPaintBox);
  property Hits: Cardinal read FHits;
end;

メインコードでは、次のことを行います。

procedure TForm11.Button1Click(Sender: TObject);
var
  thrarr: array[0..NumberOfTreads - 1] of TCalcThread;
  hndarr: array[0..NumberOfTreads - 1] of THandle;
  i, a, t: Integer;
  x, y: Integer;
begin
 caption := '';

 PaintBox1.Canvas.Brush.Color := clWhite;
 PaintBox1.Canvas.fillrect(PaintBox1.Canvas.ClipRect);

 for i := 0 to NumberOfTreads - 1 do
 begin
   thrarr[i] := TCalcThread.Create(i, PaintBox1);
   hndarr[i] := thrarr[i].Handle;
 end;

 WaitForMultipleObjects(NumberOfTreads, @hndarr, True, INFINITE);

 for i := 0 to NumberOfTreads - 1 do
   thrarr[i].Free;
end;

スレッドの Create メソッドと Execute メソッドは次のように定義されています。

constructor TCalcThread.Create(Idx: Integer; vPaintBox: TPaintBox);
begin
  FIdx := Idx;
  FHits := 0;
  xPaintBox1 := vPaintBox;

  case FIdx of
    0: xPaintBox1.Canvas.Pen.Color := clRed;
    1: xPaintBox1.Canvas.Pen.Color := clYellow;
    2: xPaintBox1.Canvas.Pen.Color := clBlue;
    3: xPaintBox1.Canvas.Pen.Color := clMoneyGreen;
  end;

  xPaintBox1.Canvas.Brush.Color := xPaintBox1.Canvas.Pen.Color;
  inherited Create(False);
end;

procedure TCalcThread.Execute;
var
  i, start, finish: Integer;
  x, y: Integer;
begin
  start := (NumberOfIterations div NumberOfTreads) * FIdx;
  finish := start + (NumberOfIterations div NumberOfTreads) - 1;

  for i := start to finish do
  begin
    case FIdx of
    0: begin
         x := Random(200) + 1;
       end;
    1: begin
         x := Random(200) + 201;
       end;
    2: begin
         x := Random(200) + 401;
       end;
    3: begin
         x := Random(200) + 601;
       end;
    end;

    y := Random((xPaintBox1.height )) + 1;
    xPaintBox1.Canvas.Ellipse(X - 5, Y - 5, X + 5, Y + 5);
  end;
end;

その結果、同じ色の 3 つの領域にいくつかの円が表示され、1 つの領域 (同じ色) に多数の円が表示されます。私が間違っていることは何ですか?

4

0 に答える 0