Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.11.11;
Скачать: CL | DM;

Вниз

убить поток   Найти похожие ветки 

 
John Eagle   (2002-09-09 17:20) [0]

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


 
Digitman ©   (2002-09-09 17:44) [1]

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

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


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

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


 
Digitman ©   (2002-09-09 18:06) [3]

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


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

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

while not Terminated do
inc(i);


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

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


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

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


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

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


 
Zemal ©   (2002-09-10 10:58) [8]

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

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


 
Fiend ©   (2002-09-10 11:02) [9]

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

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


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

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

t.terminate;
t.waitfor;

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


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

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


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

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


 
sniknik ©   (2002-09-10 19:05) [13]

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



Страницы: 1 вся ветка

Текущий архив: 2002.11.11;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.017 c
1-34046
ton2
2002-10-30 18:29
2002.11.11
Помогите с ProcessMessagees!


1-33952
Romych
2002-11-01 10:46
2002.11.11
Kulix


14-34218
TTCustomDelphiMaster
2002-10-20 15:01
2002.11.11
Продолжите пословицу


4-34313
Yus
2002-10-03 05:43
2002.11.11
Игровой порт


6-34146
Yustaz
2002-09-13 21:10
2002.11.11
traffic