![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как корректно удалить экземпляр TThread из TList? [D7]
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 само собой удалена не будет.
Вообще на мой взгляд кривоватый какой то подход ты выбрал.