Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
3-55998
Valery_N
2002-09-23 17:40
2002.10.17
Как для колонок DBGrid установить необходимую маску?


1-56035
Борис
2002-10-07 15:51
2002.10.17
Нужна dll-ка с какой-нибудь функцие проверки серийника (+)


14-56353
Карлсон
2002-09-22 20:27
2002.10.17
кто-нить перепрошивал биос на видюхе?


1-56118
arbin
2002-10-09 09:32
2002.10.17
Аналоги структур Пролог на Паскале


3-55919
Ditrix
2002-09-25 16:27
2002.10.17
SQL запрос с именем файла в параметре





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский