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