Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 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
3-33918
Andriano
2002-10-23 12:19
2002.11.11
Подскажите БД-новичку


14-34248
Карлсон
2002-10-23 23:18
2002.11.11
ну ваще!


7-34263
Keplin Sergey
2002-09-07 00:45
2002.11.11
создать несколько вложенных каталогов одной функцией!


4-34308
sveralex
2002-09-29 19:15
2002.11.11
RAS API


8-34135
DuMA
2002-07-21 15:58
2002.11.11
Как вывести изображение на время загрузки программы?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский