Главная страница
    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.57 MB
Время: 0.034 c
1-56137
Viktor1
2002-10-09 12:41
2002.10.17
Прозрачное окно!!!


3-55996
Карелин Артем
2002-09-11 09:34
2002.10.17
ADO


3-55966
Bishop
2002-09-25 11:56
2002.10.17
Можно ли отменить выполнение запроса в InterBase?


14-56316
Akella
2002-09-24 14:39
2002.10.17
ФЕМИНИЗМ


3-56014
Rserg
2002-09-26 18:52
2002.10.17
MSSQL+ADO





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский