Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.10.17;
Скачать: CL | DM;

Вниз

Вопрос про 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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.011 c
1-56090
Rouse_
2002-10-08 20:13
2002.10.17
Форма в стиле Object TreeView


1-56163
volph777
2002-10-07 10:36
2002.10.17
использование Excel


14-56287
Shadow
2002-09-23 20:16
2002.10.17
Как узнать координаты мыши?


6-56259
Werewolfru
2002-08-14 12:04
2002.10.17
Скачать файл


1-56149
mark
2002-10-06 20:29
2002.10.17
Длина строки и codetable в TRichEdit