Автор: VitalijUA
Дата сообщения: 02.07.2009 16:46
В продолжении этой темы.
У меня такая ситуация, нужно создать и удалить поток (всего их в последствии будет 3 различных) но так что бы при его повторном создании он не возвращался в ту точку в Execute где он был остановлен или удален.
Для примера создал небольшую программу для тестирования
В ней я поочередно меняю различного цвета image
type
TP1 = class(TThread)
protected
procedure Execute; override;
procedure Paint1;
end;
........
procedure TP1.Execute;
begin
{ Place thread code here }
i1:=0; //i1: byte;
x1:=0; //x1: integer;
y1:=0; //y1: intrger;
repeat
sleep(250);
if I1=16 then I1:=0;
Synchronize(Paint1);
sleep(1000);
x1:=5;
y1:=0;
i1:=1;
Synchronize(Paint1);
sleep(1000);
x1:=5;
y1:=0;
i1:=2;
Synchronize(Paint1);
.....//этот цикл может продолжаться очень долго, до нескольких минут
Synchronize(Paint1);
sleep(1000);
x1:=30;
y1:=15;
i1:=13;
Synchronize(Paint1);
sleep(1000);
x1:=0;
y1:=0;
inc(i1);
until Terminated;
end;
procedure TP1.Paint1;
begin
Form1.Label1.Caption:=IntToStr(I1)+' | x1:'+IntToStr(x1)+' y1:'+IntToStr(y1);
Form1.ImgList.Draw(Form1.PaintBox1.Canvas,x1,y1,i1);
end;
Для создания потока использую
if P1=nil then
begin
P1:=TP1.Create(True);
P1.Priority:=tpNormal;
P1.FreeOnTerminate:=False; //false для удаления в "ручную"
P1.Resume;
end;
Для удаления
if P1<>nil then
begin
P1.Suspend;
P1.Terminate;
P1.FreeInstance; //при Free не уничтожается
P1:=nil;
end;
так как один цикл в процедуре Execute может длится очень долго, с различными sleep по длительности и циклами while (в примере это не показанно) то автоматическое завершение при FreeOnTerminate:=true отпалает, программа приэтом подвисает т.е. ждет окончания цикла repeat. мне нужно чтобы поток Р1 завершался немедленно в любой момент времени, а при его повторном создании он начинался с начала Execute.
Удаление с помощью
P1.Suspend;
P1.Terminate; //или TerminateTread(P1.Handle,0);
FreeAndNil(P1); // не удаляет поток после этого продолжает работать пока недостигнет конца цикла.
Я почти добился этого но, возникают ситуации когда много раз удаляешь и создаешь поток Р1 он продолжает работать.
Еще такой нюанс, что программа долна будет работать на Win millenium, но для начала нужно разобратся на ХР.
Жду советов...