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

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

убить поток [D6, WinXP]


John Eagle ©   (2002-09-09 17:20:00) 

создаю и запускаю простейший поток (он просто число увеличивает):
t := tmythread.Create(true);
t.FreeOnTerminate := True;
t.Resume; - он нормально работает.
пытаюсь его убить при закрытии формы: t.free; - вызывается исключение ("неверный дескриптор"). если убиваю по нажатию кнопки методом: t.terminate - все оки (нормально вызывается его деструктор); тот же t.terminate вставляю в закрытие формы - деструктор потока не отрабатывает. где грабли?


sniknik   (2002-09-10 19:05:00) [1]

Люди! Я пацак с планеты земля авторитетно заявляю по ссылке которую дал
Zemal © (10.09.02 10:58)
СТОИТсходить. Даже не буде применять библиотеку (возможно и скорее всего хорошую), но там такое простое описание потоков, легкое для понимания какого я ни в одной книге не видел!
Пол дня читал и радовался :-)), что не проигнорировал, ткнул в ссылочку.


John Eagle   (2002-09-10 14:17:00) [2]

спасибо Fiend ©у - мудрую мысль посоветовал, моя ошибка была, что ставил FreeOnTerminate := True; - но при этом нельзя убивать поток методом Free, только если False; если True, то вызывать надо Terminate. Но! при втором способе при закрытии окна и при приоритете Idle, вероятно операционка не успевает выделить квант потоку, а приложение уже закрыто и Дельфийский отладчик не отрабатывает точку останова. Метод Dmitry Toropovа как раз и ожидает эту отработку.
зы. это тоже на бред похоже? :)


Dmitry Toropov   (2002-09-10 11:54:00) [3]

вдогонку.
Естетственно, перед waitfor необходимо проверить, не завершен ли поток (н-р посредством глобальной переменной и использования t.OnTerminate:=someObjectProcedure)


Dmitry Toropov   (2002-09-10 11:52:00) [4]

А мо-моему просто надо было написать:

t.terminate;
t.waitfor;

У меня так работает несмотря ни на какой приоритет.


Fiend   (2002-09-10 11:02:00) [5]

Джон, вы бредите

Прочтите мануалы про потоки. Вам сразу станет легче и вы всё поймёте


Zemal   (2002-09-10 10:58:00) [6]

Стандартный делфийный поток полнейший отстой... не буду говорить почему (очень долго и влом)... могу предложить альтернативный и совершенно бесплатный вариант - библиотеку, инкапсулирующую методы, свойства и примитивы из Win32. Библиотека работает очень устойчиво и я за полгода не нашол в ней ниодной существенной баги. Плюс в том, что библиотека позволяет, используя свойства потока виндов, осуществлять синхронизацию потоков, обмен информацией между потоками и формой, объединение потоков в группы, удобно отправлять и получать сообщения от любой формы и многое другое, и вообще всё очень удобно и просто. Больщой плюс, что у библиотеки есть РУССКИЙ САМОУЧИТЕЛЬ, справка на русском, исходники с коментариями на русском и английском... По моему мнению это колосальный и гениальный труд. Спасибо парню из далёкого города Томска, который написал эту библиотеку! Я ничего не понимал в потоках, до столкновения с этой библиотекой, теперь разобрался с потоками полностью (просмотрев все исходники) и могу на прямую из делфей работать с потоками винды. В общем всё что только можно себе вообразить уже давно реализовано в этой библиотеке. Кому интересно подробнее узнать:
http://gurin.tomsknet.ru/gala.html

P.S. Там же можно скачать исходники... всё совершенно бесплатно и без ограничений в использовании :).


Digitman   (2002-09-10 08:11:00) [7]

получаешь всенепременно)


John Eagle   (2002-09-09 18:22:00) [8]

кажется понял в чем дело: если приоритет idle, то при t.terminate прога больше не возвращается в поток и не происходит выход из него по terminated=true, т.к. idle самый низкий приоритет и следовательно не вызывается деструктор потока. получаю утечку ресурса?


John Eagle   (2002-09-09 18:15:00) [9]

точку останова.
ща попробовал приоритет tpNormal поставить - стал останавливаться, если ставлю tpIdle - не останавливается (деструктор не вызывается)


Digitman   (2002-09-09 18:06:00) [10]

а на каком основании ты утверждаешь, что деструктор не вызывается автоматически при FreeOnTerminate := True ? Ты ставил в деструкторе какую-то контрольную точку или точку останова ?


John Eagle   (2002-09-09 18:06:00) [11]

криво конечно написал:

while not Terminated do
inc(i);


John Eagle   (2002-09-09 18:03:00) [12]

так у меня в Execute прописано:
i := 1;
while 1=1 do begin
if Terminated then exit;
inc(i);
end;
при t.terminate устанавливается флаг Terminated и процедура завершается, но деструктор потока не вызывается. Я должен быть уверен, что при выходе из программы, поток уничтожился и ресурсы освободились. Может я не правильно его принудительно убиваю?


Digitman   (2002-09-09 17:44:00) [13]

FreeOnTerminate := True означает , что поток должен самостоятельно уничтожить свой экземпляр после корректного завершения процедуры Execute().

Метод Terminate() лишь взводит флаг Terminated, указывая коду потока, работающему в Execute(), на необходимость "закругляться"


Наверх

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