Wątki - jednoczesne wykonywanie

0

Napisałem dwa wątki.

  1. Chciałbym aby oba wątki wykonywały się jednocześnie. Niestety tak nie jest. Drugi wątek rozpoczyna swoje działanie dopiero po zakończeniu pierwszego. Poniżej przedstawiam kod. Napiszcie co robię źle.
  2. W czasie działania wątku nie mogę zrobić nic innego na aplikacji np: nie mogę przesunąć formy. Nie mogę również zatrzymać wątku np za pomocą przycisku.
TRectangleThread = class(TThread)
  private
    Rectangle : TShape;
    procedure MoveRectangle;
  protected
    procedure Execute; override;
  public
    procedure AfterConstruction; override;
    destructor Destroy; override;
  end;

  TEllipseThread = class(TThread)
  private
    Ellipse : TShape;
    procedure MoveEllipse;
  protected
    procedure Execute; override;
  public
    procedure AfterConstruction; override;
    destructor Destroy; override;
  end;

{ TRectangleThread }

procedure TRectangleThread.AfterConstruction;
begin
  Rectangle := TShape.Create(nil);
  Rectangle.Parent := Form1;
  Priority := tpNormal;
  Resume;
end;

destructor TRectangleThread.Destroy;
begin
  Rectangle.Free;
  inherited;
end;

procedure TRectangleThread.Execute;
begin
  inherited;
  Synchronize(MoveRectangle);
end;

procedure TRectangleThread.MoveRectangle;
var
  I : Integer;

begin
    for I := 1 to 360 do
    begin
      Rectangle.Left := Round(360 * sin(DegToRad(I))) + 360;
      Rectangle.Top := Round(360 * cos(DegToRad(I))) + 360;
      Form1.Refresh;
      sleep(10)
    end;
end;

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin
  RectangleThread := TRectangleThread.Create(True);
end;

procedure TForm1.buCreateClick(Sender: TObject);
begin
  RectangleThread := TRectangleThread.Create(True);
  EllipseThread := TEllipseThread.Create(True);
end;

procedure TForm1.buTerminateClick(Sender: TObject);
begin
  RectangleThread.Terminate;
  EllipseThread.Terminate;
end;

procedure TForm1.buResumeClick(Sender: TObject);
begin
  RectangleThread.Resume;
  EllipseThread.Resume;
end;

{ TEllipseThread }

procedure TEllipseThread.AfterConstruction;
begin
  Ellipse := TShape.Create(nil);
  Ellipse.Parent := Form1;
  Ellipse.Shape := stEllipse;
  Priority := tpHigher;
  Resume;
end;

destructor TEllipseThread.Destroy;
begin
  Ellipse.Free;
  inherited;
end;

procedure TEllipseThread.Execute;
begin
  inherited;
  Synchronize(MoveEllipse);
end;

procedure TEllipseThread.MoveEllipse;
var
  I : Integer;
  xyz : Real;

begin
  for I := 0 to 360 do
  begin
    Ellipse.Left := Round(100 * sin(DegToRad(I))) + 100;
    Ellipse.Top := Round(100 * cos(DegToRad(I))) + 100;
    Form1.Refresh;
  end;
end;

Pomóżcie!
0
procedure TRectangleThread.Execute;
begin
  inherited;
  Synchronize(MoveRectangle);
end;

^^ tworzysz wątek, po czym i tak cały jego kod wykonujesz w kontekście wątku vcl - trochę bez sensu - z metody synchronize nie korzysta się w ten sposób! tak jak robisz to pracuje wątek vcl, a wątek TRectangleThread sobie czeka, aż wątek vcl skończy wykonywać synchronize.
przez synchronize zrób tylko rysowanie po canvasie, albo jeszcze lepiej - poczytaj o synchronizacji procesów i zrób tak, żeby żadne dwa wątki nie dossały się do tego samego canvasa jednocześnie (np. initializecriticalsection/entercriticalsection/leavecriticalsection/deletecriticalsection).

poza tym co to prostytutka za temat?

1 użytkowników online, w tym zalogowanych: 0, gości: 1