Форум: "Система";
Текущий архив: 2002.11.11;
Скачать: [xml.tar.bz2];
Внизубить поток Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.008 c