Создается многопоточное приложение, в котором демонстрируется образование и приостановка трех потоков, изменение их приоритетов и уничтожение (освобождение ресурсов)
Подскажите пожалуйста как завершить потоки в цикле с помощью метода Terminate?
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, ComCtrls, StdCtrls, Unit2;
type
TForm1 = class(TForm)
pb1: TPaintBox;
pb2: TPaintBox;
pb3: TPaintBox;
TrackBar1: TTrackBar;
TrackBar2: TTrackBar;
TrackBar3: TTrackBar;
btn1: TButton;
btn2: TButton;
btn3: TButton;
btn4: TButton;
btn5: TButton;
btn6: TButton;
btn7: TButton;
procedure FormCreate(Sender: TObject);
procedure btn4Click(Sender: TObject);
procedure btn5Click(Sender: TObject);
procedure btn6Click(Sender: TObject);
procedure btn1Click(Sender: TObject);
procedure btn2Click(Sender: TObject);
procedure btn3Click(Sender: TObject);
procedure TrackBar1Change(Sender: TObject);
procedure btn7Click(Sender: TObject);
private
taxi00:tbitmap;
taxi01:TBitmap;
public
Destructor Destroy; override;
end;
var
Form1: TForm1;
thread1:TMoveThread;
thread2:TMoveThread;
thread3:TMoveThread;
I:Integer;
priority:TThreadPriority;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
taxi00:=tbitmap.Create; // Создается объект BitMap
taxi00.LoadFromFile('taxi00.bmp'); //В него загружается изображение
taxi01:=tbitmap.Create;
taxi01.LoadFromFile('taxi01.bmp');
thread1:= TMoveThread.Create(taxi00,taxi01,pb1); //Создается поток
Thread1.Priority:=tpLowest; // Устанавливается небольшой приоритет у потока; это необходимо для того, чтобы поток был управляемым и не забирал все ресурсы.
thread2:= TMoveThread.Create(taxi00,taxi01,pb2); //Создается поток
Thread2.Priority:=tpLowest;
thread3:= TMoveThread.Create(taxi00,taxi01,pb3); //Создается поток
Thread3.Priority:=tpLowest;
Thread1.Suspend;
Thread2.Suspend;
Thread3.Suspend;
end;
procedure TForm1.btn4Click(Sender: TObject);
begin
if Thread1.Suspended=false then Thread1.Suspend;
end;
procedure TForm1.btn5Click(Sender: TObject);
begin
if Thread2.Suspended=false then Thread2.Suspend;
end;
procedure TForm1.btn6Click(Sender: TObject);
begin
if Thread3.Suspended=false then Thread3.Suspend;
end;
procedure TForm1.btn1Click(Sender: TObject);
begin
if Thread1.Suspended=true then Thread1.Resume;
end;
procedure TForm1.btn2Click(Sender: TObject);
begin
if Thread2.Suspended=true then Thread2.Resume;
end;
procedure TForm1.btn3Click(Sender: TObject);
begin
if Thread3.Suspended=true then Thread3.Resume;
end;
procedure TForm1.TrackBar1Change(Sender: TObject);
begin
begin
priority:=tpIdle;
for i:=0 to ((sender as ttrackbar).position -1) do inc(priority);
if sender=trackbar1 then thread1.priority:=priority
else
if sender=trackbar3 then thread3.priority:=priority
else thread2.Priority:=priority;
end;
end;
destructor TForm1.Destroy;
begin
Taxi00.free;
Taxi01.free;
inherited Destroy;
end;
procedure TForm1.btn7Click(Sender: TObject);
begin
Form1.Close;
end;
end.
Код:
unit Unit2;
interface
uses
Classes, Graphics, ExtCtrls, SysUtils;
type
TMoveThread = class(TThread)
private
FBox: TPaintBox; // Где воспроизводится картинка
b0,b1: tbitmap; // Сами картинки
i:integer; // Для определения координат картинки
procedure DoVisualSwap; // Одна процедура двигает вправо,
procedure DoVisual; // Другая влево
protected
procedure Execute; override;
public
Thread1,
Thread2,
Thread3:TMoveThread;
constructor Create(a,b: TBitmap; c:TPaintBox);
destructor Destroy; override;
end;
implementation
constructor TMoveThread.Create(a,b:tbitmap; c:TPaintBox);
begin
b0:=a;b1:=b;Fbox:=c;i:=0;
inherited Create(False);
end;
destructor TMoveThread.Destroy;
begin
b0.free;
b1.free;
inherited Destroy;
end;
procedure TMoveThread.Execute;
begin
begin
while true do
begin
while i<=(fbox.Width+b0.Width) do Synchronize(DoVisualSwap);
while i>=(0-b0.Width) do Synchronize(DoVisual);
end;
end;
end;
procedure TMoveThread.DoVisualSwap; { Двигает картинку вправо }
begin
with FBox do
begin
canvas.Draw(i,0,b0);
inc(i);
end;
Sleep(2);
end;
procedure TMoveThread.DoVisual; { Двигает картинку влево }
begin
with FBox do
begin
canvas.Draw(i,0,b1);
dec(i);
end;
Sleep(2);
end;
end.