Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с уничтожением TThread, разное время уничтожения 
:(
    Опции темы
pethead
  Дата 1.6.2009, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 13.11.2007

Репутация: нет
Всего: нет



забавная штука. вот есть у меня в одном классе внутрений thread.
если его не трогать а просто создать и перевести в спячку то он дестроится быстро. а если его запустить и там он что то покрутит какой то процесс, то потом снова перевести в спячку, топосле этого он дестроится неприлично долго.
среда дельфи6.

итак есть класс, в его креатере код:

fPollThread:=TPollThread.Create(True);// т.е. Suspend:=True - стоим ничего не делаем
fPollThread.FreeOnTerminate:=False;
fPollThread.Delay:=100;
fPollThread.OnPoll:=OnPoll;

далее где то в программе OnPoll
активизируется (или не активизируется) этот поток, т.е. в нем начинает крутится процедура OnPoll
потом где то там в программе поток деактивируется в Suspend.

в конце работы программы все уничтожается.
(все потоки заведомо переведены в Suspend!)

код деструктора класса

fPollThread.OnPoll:=nil;
fPollThread.Terminate;
FreeAndnil(fPollThread);//здесь существенная задержка если однажды поток был Resumed

выяснил что в момент  FreeAndnil(fPollThread) еще раз отрабатывается OnExecute. 
в Execute вызывается OnPoll но т.к. он уже =nil то ничего полезного не делается.

странно... хотя поток в Suspend.





Это сообщение отредактировал(а) pethead - 1.6.2009, 18:54
PM MAIL WWW ICQ   Вверх
kami
Дата 1.6.2009, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 15
Всего: 72



Цитата(pethead @  1.6.2009,  18:36 Найти цитируемый пост)
выяснил что в момент  FreeAndnil(fPollThread) еще раз отрабатывается OnExecute. в Execute вызывается OnPoll но т.к. он уже =nil то ничего полезного не делается.странно... хотя поток в Suspend.


Ничего странного.
Нужно только посмотреть исходники.
Код

if (FThreadID <> 0) and not FFinished then
  begin
    Terminate;
    if FCreateSuspended then // а вот и ответ на этот сложный вопрос.
      Resume;
    WaitFor;
  end;

PM MAIL WWW   Вверх
pethead
Дата 1.6.2009, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 13.11.2007

Репутация: нет
Всего: нет



а какой в этом смысл?

щас у меня написано так что создается всегда но не запускается. запускается по нужде потом. но зато и лишний раз резюмится при уничтожении.

похоже мне надо так написать код чтобы при нужде что то выполнить в потоке поток бы создавался сразу и запускался (CreateSuspend:=False)
а при прекращении нужды поток убивать.



Это сообщение отредактировал(а) pethead - 1.6.2009, 20:31
PM MAIL WWW ICQ   Вверх
kami
Дата 1.6.2009, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 15
Всего: 72



Цитата(pethead @  1.6.2009,  20:04 Найти цитируемый пост)
ведь уже все терминировано и мне этот вызов только усложняет жизнь.

Это знаете вы.
Но этого не знает компилятор.
Причина проста: не буду говорить за всех, но весь код инициализации (особенно - потокозависимых полей) я размещаю в Execute потока. И финализации тоже.
Поток же может быть заснут в любом состоянии. И если терминировать его  не разбудив - кто высвободит занятые в инициализации ресурсы?
PM MAIL WWW   Вверх
pethead
Дата 1.6.2009, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 13.11.2007

Репутация: нет
Всего: нет



Цитата(kami @  1.6.2009,  20:29 Найти цитируемый пост)
И если терминировать его  не разбудив - кто высвободит занятые в инициализации ресурсы? 
 кажись понял.
PM MAIL WWW ICQ   Вверх
pethead
Дата 8.6.2009, 08:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 13.11.2007

Репутация: нет
Всего: нет



deleted


Это сообщение отредактировал(а) pethead - 8.6.2009, 08:36
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0754 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.