Napisałem dwa wątki.
- 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.
- 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!