Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2009.02.22;
Скачать: [xml.tar.bz2];

Вниз

Объект класса TThread коррекно не завершается   Найти похожие ветки 

 
AndreiDeJavu   (2008-03-17 14:30) [0]

Доброго времени суток всем!

Столкнулся со следующей проблемой,- создаю объект класса TThread (вернее, от класса-наследника :-), запускаю (в его execute всего 1 вызов функции, в которой в свою очередь идут вызовы других функций, создание объектов разных классов и т.д., в основном работа связана с обработкой большого количества файлов, ну и поиском их по папкам). Так вот почему то случайным образом возникает ошибка, после того как я делаю вызов suspend и terminate, приложение подвисает... Ощущение, что это дедлок какой-то. Прошу совета, как это побороть?))) Да, пробовал в таймере с интервалом 1 Мс поставить Application.ProcessMessages,- не помогло... + В другом таймере (с интервалом 1Мс), когда мне нужно завершить поток, вставить
if (not th.suspended) then th.suspend;
if (not th.terminated) then th.terminate;

Не помогло.


 
Сергей М. ©   (2008-03-17 14:32) [1]


> if (not th.suspended) then th.suspend;
> if (not th.terminated) then th.terminate;
> Не помогло.
>


А обязано было помочь ?


 
Сергей М. ©   (2008-03-17 14:34) [2]


> случайным образом возникает ошибка


В алгоритмике и программировании любая "случайность" есть следствие закономерности)


 
AndreiDeJavu   (2008-03-17 14:37) [3]

Ну по идее поток так должен завершиться) В 90% случаях он и завершается... Сергей, может подскажете, что может помочь?))


 
Leonid Troyanovsky ©   (2008-03-17 14:37) [4]


> AndreiDeJavu   (17.03.08 14:30)  

> делаю вызов suspend и terminate, приложение подвисает...
>  Ощущение, что это дедлок какой-то.

Это называется suspend. Сделай еще resume -
и будет те щастье.

--
Regards, LVT.


 
Сергей М. ©   (2008-03-17 14:48) [5]


> по идее поток так должен завершиться


По чьей идее ?


> что может помочь?


Помочь может внимательное изучение всего того что происходит при вызовах этих (и многих других) методов поточного класса.

Suspend "вгоняет" поток в вечную спячку.
А Terminate всего лишь устанавливает поле FTerminated = True

Т.е. ты сказал потоку "Засни, зараза !" и после этого требуешь от него каких-то контролируемых им действий)


 
AndreiDeJavu   (2008-03-17 14:57) [6]

Leonid, после resume поток возобновляет работу... а мне нужно гарантированно его завершить.

Сергей, а есть метод или способ работы с этим классом, при котором поток был бы гарантированно "убит", вне зависимости от того, что в нем выполняется и как? То-есть, в любой момент времени я мог бы по клику баттона его обрубить.))


 
Сергей М. ©   (2008-03-17 15:01) [7]


> AndreiDeJavu   (17.03.08 14:57) [6]


Есть.
Но не метод, а стандартная WinAPI-функция TerminateThread().
По сути ее применение оправдано лишь в аварийных случаях, т.е. в случаях, которые программист по той или иной объективной причине не может предвидеть.
Сомневаюсь, что тотт самый "аварийный случай" и есть твой случай.


 
AndreiDeJavu   (2008-03-17 15:13) [8]

А корректно ли искользовать TerminateThread() при работе с объектом, наследуемым от TThread?


 
Сергей М. ©   (2008-03-17 15:19) [9]

Ответственность за последствия использования этой ф-ции целиком и полностью лежит на тебе.

Но еще раз заостряю твое внимание - применение этой ф-ции оправдано только в критических ситуациях. Твои же жалобы на якобы "подвисание" чего-то там без детального изучения и четкого понимания причин этого подвисания не являются поводом для применения этой функции.


 
Leonid Troyanovsky ©   (2008-03-17 15:30) [10]


> AndreiDeJavu   (17.03.08 15:13) [8]

> А корректно ли искользовать TerminateThread() при работе
> с объектом, наследуемым от TThread?

Пиши корректные функции потока, которые реагируют на Terminate,
тогда и не будет нужды в TerminateThread.

А Suspend/Resume - это, во-ще, отладочные функции, в обычной жизни
их не пользуют.

--
Regards, LVT.


 
AndreiDeJavu   (2008-03-17 15:36) [11]

Сергей, Leonid,
Интересно, а как сделать так, чтобы код функций, которые выполняются в потоке, не жил своей жизнью, а реагировал на Terminate?=))  У меня там проводятся довольно емкие вычисления...ProcessMessages не помогает.

Может Syncronize?))


 
Сергей М. ©   (2008-03-17 15:48) [12]


> AndreiDeJavu   (17.03.08 15:36) [11]


> как сделать так, чтобы код функций, которые выполняются
> в потоке, не жил своей жизнью, а реагировал на Terminate?
>


Встречный вопрос - как сделать так, чтобы, к примеру, как можно быстрей узнать о наличии почтовой корреспонденции в своем почтовом ящике ?


 
AndreiDeJavu   (2008-03-17 15:55) [13]


> Встречный вопрос - как сделать так, чтобы, к примеру, как
> можно быстрей узнать о наличии почтовой корреспонденции
> в своем почтовом ящике ?

Наверное, жать F5 при веб интерфейсе, или держать программу клиент в свернутой в трее)). Это к тому, что нужно как то опрашивать код, выполняемый в потоке?))) Я понимаю, что это необходимо, но не знаю, как это сделать, как определить, какая именно строчка спустя минуту после запуска  потока выполняется, и как сказать потоку,- стоп, умри.))


 
Сергей М. ©   (2008-03-17 16:05) [14]


> Наверное, жать F5 при веб интерфейсе, или держать программу
> клиент в свернутой в трее


Я вообще-то об обычном почт.ящике, висящем у тебя в подъезде или на калитке)
Чем чаще ты к нему бегаешь, тем быстрее получишь почту, если ты ее вообще ждешь.

Не бегаешь - вообще ничего не получишь, за тебя никто туда бегать не будет)


> как сказать потоку,- стоп, умри


Прямая аналогия с почтовым ящиком:

- Со стороны потока-отправителя процедура помещения в ящик корреспонденции выглядит как вызов метода Terminate

- Со стороны потока-получателя проверка ящика на получение ожидаемой корреспонденции выглядит как булево св-во Terminated.


 
AndreiDeJavu   (2008-03-17 16:14) [15]

Сергей,
procedure th.execute;
 begin
   if not terminated then
       Proceeding( strDirName );
 end;

Но у меня в Proceeding еще очень много вызовов других функций, те в свою очередь вызывают еще и еще...
Как они в свою очередь узнают о том, что им пора б закругляться?)


 
Сергей М. ©   (2008-03-17 16:19) [16]


> Как они в свою очередь узнают о том, что им пора б закругляться?


Так ничто ж не мешает в телах этих функций обращаться к св-ву Terminated)


 
AndreiDeJavu   (2008-03-17 17:03) [17]

То-есть, если функций штук 300... получается просто жесть...)) Ну ладно, спасибо). Буду дописывать.


 
Сергей М. ©   (2008-03-17 17:08) [18]


> если функций штук 300... получается просто жесть


> Буду дописывать.


"Дописывать" надо с умом.
Проверка на Terminated имеет смысл лишь в длительных по времени алгоритмах, в первую очередь циклических.


 
AndreiDeJavu   (2008-03-17 18:13) [19]


> Проверка на Terminated имеет смысл лишь в длительных по
> времени алгоритмах, в первую очередь циклических.

Ok)). Так и сделал, вроде все отлично). Спасибо!



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

Форум: "WinAPI";
Текущий архив: 2009.02.22;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.007 c
15-1229063583
MBo
2008-12-12 09:33
2009.02.22
Пятничные задачки. Вася Пупкин скорее жив, чем мертв...


2-1231824561
r900000
2009-01-13 08:29
2009.02.22
Работа с Мемо компонентами


2-1231438760
NEWichok
2009-01-08 21:19
2009.02.22
Как организовать проверку перед "POST"?


4-1203884779
art36
2008-02-24 23:26
2009.02.22
устройство веб камеры + видео поток + delphi


4-1206106972
chak_xakep
2008-03-21 16:42
2009.02.22
Как на Delphi посредством WIN32API создать MainMenu





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский