Текущий архив: 2004.06.20;
Скачать: CL | DM;
Вниз
TThread Найти похожие ветки
← →
TGrey (2004-06-03 23:52) [0]Доброго времени суток!
Использую в приложении класс TThread, вызываю конструктор с параметром True, затем вызваю метод Resume, выполняется метод execute и поток завершается. Как запустить поток заново?
← →
Palladin © (2004-06-04 02:32) [1]Во первых FreeOnTerminate:=False и Resume.
← →
Digitman © (2004-06-04 08:12) [2]
> Как запустить поток заново?
все по-новой : "..вызываю конструктор с параметром True, затем вызваю метод Resume, выполняется метод execute и поток завершается"
← →
ZHK © (2004-06-04 08:24) [3]Можно еще в методе Execute сделать вечный цикл с проверкой в начале какой-то переменной. Где-то так:
TMyThread=class(TThread);
ToGo:boolean;
...
constructor Create;
...
procedure Execute; override;
...
function GoAgain:Boolean;
end;
constructor TMyThread.Create;
begin
// инициализация
ToGo:=False;
end;
procedure TMyThread.Execute;
begin
while True do
begin
while not (ToGo and Terminate) do;
if Terminate then Exit;
// выполняю все, что мне нравится
ToGo:=False;
end;
end;
procedure TMyThread.GoAgain:Boolean;
begin
Result:=not ToGo;
ToGo:=True;
end;
Попробуй так. А вдруг понравится? У меня работает.
← →
ZHK © (2004-06-04 08:27) [4]Хотя стой, ошибся, писал второпях:
> while not (ToGo or Terminate) do;
← →
evvcom © (2004-06-04 10:04) [5]
> ZHK ©
Terminate - это метод, который реализован так:
procedure TThread.Terminate;
begin
FTerminated := True;
end;
В Вашем примере много путанного и лишнего. Если уж делать "бесконечный" цикл, то все же так:
while not Terminated do begin
...
end;
Внутри этого цикла, когда данные заканчиваются, поток надо усыплять Suspend. А из других потоков, подкинув следующую порцию данных и решив, что этот поток должен продолжить работу, его разбудить Resume.
А Terminate вызывать тогда, когда поток больше не нужен вовсе (из любого потока).
Страницы: 1 вся ветка
Текущий архив: 2004.06.20;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.027 c