Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вопрос про TThread


Демонов Е.В. ©   (2002-10-07 13:43:00) 

Такой вопрос.

Есть поток:

procedure TMyThread.Execute;
begin
FreeOnTerminate := True;
...........//Выполняется код испльзуя свойство Terminated;
end;


Соэдаю этото поток s:=TMyThread.Create;
Он Выполняется

И иногда его надо остановить

s.Terminate;
s.WaitFor
.....//Чегото делаю;

Так вот при выплонении s.WaitFor вылазит ошибка - Неверный дескриптор (код 6)

А если убрать из Exeсute строку FreeOnTerminate := True; то тогда всё нормально.

В чём дело ? Раскажите что я делаю не так.
Спасибо..


Nomad.kz   (2002-10-07 15:01:00) [1]

Из примера хэлповского 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;


Петя   (2002-10-07 14:46:00) [2]

>>Reindeer Moss Eater
Вот это я хотел услышать.


Reindeer Moss Eater   (2002-10-07 14:42:00) [3]

FreeOnTerminte := True удобно для потоков реализованных по принципу "Запустила и забыла".
Если надо ждать завершения, то лучше дескрипторы освобождать самому


Петя   (2002-10-07 14:33:00) [4]

>>Не надо ждать того, чего уже нет.
Ну так и уж не.
Например

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:01:00) [5]

ну это я понял. А как в этом случае быть.
Не надо ждать того, чего уже нет.


Демонов Е.В.   (2002-10-07 13:55:00) [6]

Reindeer Moss Eater
>>К моменту вызова
>>s.WaitFor
>>дескриптор нити уже освобожден

ну это я понял. А как в этом случае быть. Те надо убирать FreeOnTerminate := True и делать так
s.Terminate;
s.WaitFor
s.destroy
??????????



Кот Бегемот   (2002-10-07 13:55:00) [7]

Идеологически неправильно

Используй Suspend / Resume


Reindeer Moss Eater   (2002-10-07 13:46:00) [8]

К моменту вызова
s.WaitFor
дескриптор нити уже освобожден


Наверх

Титульная страница Поиск, карта сайта Написать письмо