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

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

Как корректно удалить экземпляр TThread из TList? [D7]


Страницы:   1 2 3 4 5

kotyara12 ©   (2010-05-12 21:22:00) 

Может и друрацкий вопрос, но я уже совсем запутался: я создаю несколько независимых потоков с FreeOnTerminate = True и помещаю их в экземпляр TList. Что произойдет, если поток отработает до конца и удалиться из памяти? Произойдет ли при этом удаление соответствущего указателя из TList или нужно как-то по другому удалить отработавший поток?


Eraser   (2010-05-12 23:23:00) [81]

> [10] Rouse_ ©   (12.05.10 23:18)


> Вопрос: зачем тогда он вообще нужен класс этот без использования
> FreeOnTerminate, если стандартные АПИ гораздо качественней
> выполняют все описанное? :)

кстати, всегда интересовал такой вопрос - где правильно уничтожать дескриптор созданного через Begin/CreateThread потока? )


kotyara12   (2010-05-12 23:23:00) [82]


> Rouse_ ©

это как раз и есть сервис...


Loginov Dmitry   (2010-05-12 23:21:00) [83]


> Думаю, будет работать... завтра проверим :-)


Вместо TList в таких случаях следует использовать TThreadList, иначе глюки "непонятной" природы не заставят себя ждать.


antonn   (2010-05-12 23:18:00) [84]

там Synchronize() случаем не нужен?


Rouse_   (2010-05-12 23:18:00) [85]

DVM, я немножко разовью свой предыдущий пост. Сразу предупреждаю - все естественно мое ИМХО.
TThread достаточно кривовато сделанный класс, прежде всего ествественно из-за механизма синхронизации. Мне очень не понятно почему синхронизация нити в классе TThread делается всегда с главной нитью приложения, а не с той нитью из которой был создан данный обьект. Сразу естественно наступаем на грабли в рамках сервисов - главная нить приложения отвечает за общение службы с SCM и соответственно 99.9 процентов времени находится в суспенде.

Что остается - остается только пресловутый FreeOnTerminate, который позволяет нам не заморачиваться на написание кода типа WaitForSingleObject, а просто создать нить - передать ей задачу и забыть.
Если мы отказываемся от данной фичи, то мы имеем на руках:
1: необходимость собственной синхронизации
2. необходимость самостоятельного отслеживания времени жизни нити

Вопрос: зачем тогда он вообще нужен класс этот без использования FreeOnTerminate, если стандартные АПИ гораздо качественней выполняют все описанное? :)


kotyara12   (2010-05-12 23:10:00) [86]

На данный момент сделал так:
Поток задания:

constructor TAuFpdThread.Create(...);
begin
 inherited Create(True);
 FreeOnTerminate := True;
......


Основной поток:

             TaskItem := TAuFpdThread.Create(...);
             TaskItem.OnTerminate := TerminateTask;
             fTaskList.Add(TaskItem);



procedure TFpdService.TerminateTask(Sender: TObject);
begin
 fTaskList.Remove(Sender);
end;


Думаю, будет работать... завтра проверим :-)


Игорь Шевченко   (2010-05-12 23:06:00) [87]


> FreeOnTerminate = True - это крайне глюконосная фича, которой
> на мой взгляд лучше избегать.


аргументы будут ? :)


Rouse_   (2010-05-12 22:51:00) [88]


> DVM ©   (12.05.10 22:16) [6]
> FreeOnTerminate = True - это крайне глюконосная фича, которой
> на мой взгляд лучше избегать.
> Лучше собственноручно отслеживать завершение работы потока
> и уничтожать объекты TThread.

На основе чего сделан столь сочный вывод? Нет, я конечно понимаю что лучше взять готовый велосипед и немножно его погнуть (читай написать заново уже написанный код), но...?


DVM   (2010-05-12 22:16:00) [89]


> kotyara12   (12.05.10 21:49) [2]

FreeOnTerminate = True - это крайне глюконосная фича, которой на мой взгляд лучше избегать.
Лучше собственноручно отслеживать завершение работы потока и уничтожать объекты TThread.


kotyara12   (2010-05-12 22:15:00) [90]


> Anatoly Podgoretsky ©   (12.05.10 22:01) [4]
> > kotyara12  (12.05.2010 21:51:03)  [3]OnTerminate

А не лучше в таком случае в поток при создании передать указатель на List и в Destroy вызвать fList.Remove(Self)?


Anatoly Podgoretsky   (2010-05-12 22:01:00) [91]

> kotyara12  (12.05.2010 21:51:03)  [3]

OnTerminate


kotyara12   (2010-05-12 21:51:00) [92]

Если при создании потока поставить, FreeOnTerminate = False, то отработавший поток останется в памяти до полного удаления списка, а отследить "извне", отработал поток или еще нет - у меня не получилось.


kotyara12   (2010-05-12 21:49:00) [93]


> Вообще на мой взгляд кривоватый какой то подход ты выбрал

Как тогда лучше поступить? Подскажи, если не в лом....


DVM   (2010-05-12 21:37:00) [94]


> Что произойдет, если поток отработает до конца и удалиться
> из памяти?

Поток отработает, экземпляр TThread будет разрушен. Из TList ссылка на уже несуществующий экземпляр TThread само собой удалена не будет.

Вообще на мой взгляд кривоватый какой то подход ты выбрал.


Страницы:   1 2 3 4 5

Наверх

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