Форум: "Основная";
Текущий архив: 2002.10.17;
Скачать: [xml.tar.bz2];
ВнизВопрос про TThread Найти похожие ветки
← →
Демонов Е.В. (2002-10-07 13:43) [0]Такой вопрос.
Есть поток:
procedure TMyThread.Execute;
begin
FreeOnTerminate := True;
...........//Выполняется код испльзуя свойство Terminated;
end;
Соэдаю этото поток s:=TMyThread.Create;
Он Выполняется
И иногда его надо остановить
s.Terminate;
s.WaitFor
.....//Чегото делаю;
Так вот при выплонении s.WaitFor вылазит ошибка - Неверный дескриптор (код 6)
А если убрать из Exeсute строку FreeOnTerminate := True; то тогда всё нормально.
В чём дело ? Раскажите что я делаю не так.
Спасибо..
← →
Reindeer Moss Eater (2002-10-07 13:46) [1]К моменту вызова
s.WaitFor
дескриптор нити уже освобожден
← →
Демонов Е.В. (2002-10-07 13:55) [2]Reindeer Moss Eater
>>К моменту вызова
>>s.WaitFor
>>дескриптор нити уже освобожден
ну это я понял. А как в этом случае быть. Те надо убирать FreeOnTerminate := True и делать так
s.Terminate;
s.WaitFor
s.destroy
??????????
← →
Кот Бегемот (2002-10-07 13:55) [3]Идеологически неправильно
Используй Suspend / Resume
← →
Reindeer Moss Eater (2002-10-07 14:01) [4]ну это я понял. А как в этом случае быть.
Не надо ждать того, чего уже нет.
← →
Петя (2002-10-07 14:33) [5]>>Не надо ждать того, чего уже нет.
Ну так и уж не.
Например
procedure TMyThread.Execute;
begin
FreeOnTerminate := True;
while not terminated do
.....что то
end;
И предположим что это чтото делается 2 секунды // ну так надо.
В главном потоке
я делаю
s.Terminate;
s.WaitFor; // здесь я должен убедится что s закончила работу
И ЧЕГОТО ДеЛаю.
Как тогда...
Или ... вот что я подумал .. если ккой то код будет выполнятся аж 2 сек. в потоке s то тогда строка s.WaitFor начнёт выполнится ещё до окончания этого двухсекундного кода.
Ну поправте меня если я не прав.
← →
Reindeer Moss Eater (2002-10-07 14:42) [6]FreeOnTerminte := True удобно для потоков реализованных по принципу "Запустила и забыла".
Если надо ждать завершения, то лучше дескрипторы освобождать самому
← →
Петя (2002-10-07 14:46) [7]>>Reindeer Moss Eater
Вот это я хотел услышать.
← →
Nomad.kz (2002-10-07 15:01) [8]Из примера хэлповского TProgressBar, TThread example (pg1.pas):
procedure TForm1.FormDestroy(Sender: TObject); // Terminate any threads still running
begin
if (MyThread1 <> nil) and (Thread1Active = true) then
begin
MyThread1.Terminate;
MyThread1.WaitFor; // wait for it to terminate
end;
if (MyThread2 <> nil) and (Thread2Active = true) then
begin
MyThread2.Terminate;
MyThread2.WaitFor;
end;
end;
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.10.17;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.008 c