|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
21.11.2011, 23:58 | #1 |
Старожил
Регистрация: 30.12.2009
Сообщений: 11,430
|
При освобождении обьекта TThread, он вешает всю программу. При этом код Execute у TThread уж выполнился..
Доброго времени суток...
Есть таймер, который каждую пытается запустить поток(TThread), предварительно проверив его на nil: Код:
Поток запускается с флагом FreeOnTerminate:=True В потоке выполняется код "пинга" UDP сервера: Код:
программа прыгает на код Synchronize(fOnTimeout);, процедура вызвается. Все проходит нормально. Как и я и оидал, НО ссылка на поток(PingThr) не равна nil. Код потока закончился и делать ему уже нечего, по этому он должен прибится до конца. Увы его что-то держит от этого. И повторно пустить поток не получается. А если просто вызвать FreeAndNil, вешается вся программа. Помогите, пожалуйста! |
22.11.2011, 00:14 | #2 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
Я думаю ваш поток ни что не держит, память освобождена, а вот PingThr не nil, и откуда он там возмется после завершения потока?
add Можно попробовать поток запускать с FreeOnTerminate=False. Перед самым завершением он какую-то переменную в основном потоке в True устанавливает с использованием Synchronize. Таймер анализирует эту переменную, и если она True, то ждет завершение потока WaitFor, после чего Free и создание нового потока
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Последний раз редактировалось Аватар; 22.11.2011 в 00:34. |
22.11.2011, 06:02 | #3 |
кривокодер ;)
Форумчанин
Регистрация: 20.06.2008
Сообщений: 707
|
Поток и не должен удалиться...
Создание потока - дело весьма длительное. Поэтому, потоку при завершении ставится статус Terminated, но он не удаляется. А вообще, логика программы слегка нарушена. Вам настолько важно пинговаться РОВНО через секунду? Код:
Код:
"А как написать праграму?, "ришыти задачьку очинь нада" ©с форума. Жить становится интереснее, жить становится веселее...
{Быть или не быть} {Неуспешный суицид} Последний раз редактировалось Johnson; 22.11.2011 в 06:05. |
24.11.2011, 04:44 | #4 |
Старожил
Регистрация: 30.12.2009
Сообщений: 11,430
|
Всеравно не догоняю..
Вот в чём смысл.. При запуске ПО, моя программа запускает поток пинга, а тот пингует запущенное ПО. Как только ПО не пингуется сработывает действие(Рестарт - вещается не пингующееся ПО, и все перезапускается по новой). Как это зделать? Сейчас у меня все через "пятую точку опоры". Прри создании обьекта ПО, создаётся таймер, который проверяет не равен ли поток nil'у нели, равен запускает его. Тот отработывает 1 раз и вырубается. И так, пока ПО будет не пинговаться. Но я знаю что можно и без этого гемора. КАК? Конкретно, хочу выкинуть таймер, который пытается запускать поток пинга. Ну или как по меньше гемора, чтобы поток работал постоянно, до того как перестаёт пинговаться ПО, при этом срабатывает действие. |
24.11.2011, 05:56 | #5 |
кривокодер ;)
Форумчанин
Регистрация: 20.06.2008
Сообщений: 707
|
ПО, которое проверяете - Ваше?
Поток исполняется в нем?
"А как написать праграму?, "ришыти задачьку очинь нада" ©с форума. Жить становится интереснее, жить становится веселее...
{Быть или не быть} {Неуспешный суицид} |
24.11.2011, 11:17 | #6 |
Старожил
Регистрация: 30.12.2009
Сообщений: 11,430
|
Нет, ПО(Консольная сервер-программа) которое нужно пропинговать - не моё.
Знаю как с ним общаться, по этому возможен пинг. Моя программа создаёт Object программы в ObjectList, в это обьекте 2 потока, 1 основнной, который запускается и запускает ПО и ждёт его завершения, а второй - это поток пинга, который запускается когда запускается первый поток, и останавливается когда останавливается первый. Задача пингующего потока, среагировать на недоступность сервер-сокета в программе, и прибить повисшую консоль сервера, основной поток, себя любимого и перезапустить всё по новой. Последний раз редактировалось Человек_Борща; 24.11.2011 в 11:20. |
28.11.2011, 01:07 | #7 |
Старожил
Регистрация: 30.12.2009
Сообщений: 11,430
|
Моё состояние сейчас примерно такое:
Всеравно, хоть убей поток не вешается. И при этом ни *** не делает. Запускаю всё это дело так: Код:
Код:
Код:
Он больше ничего не делает. При вызове procedure Stop, пытаюсь вызвать FreeAndNil, т.к. freeonterminate=false. В этот момент у потока свойство FFinished = TRUE. Вся программа просто висит. ПОЧЕМУ? Последний раз редактировалось Человек_Борща; 28.11.2011 в 01:11. |
28.11.2011, 09:33 | #8 | ||
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
Цитата:
Цитата:
I'm learning to live...
|
||
28.11.2011, 11:17 | #9 |
Старожил
Регистрация: 30.12.2009
Сообщений: 11,430
|
я же говорю, программа потока полностью завершена.
Прыгает на конец процендуры Execute. И не прибивается. Специально и сделал так: Код:
Оно прыгает на метод start(Ну второй поток оно не создаёт, зачем). Затем назад в метод Execute, в цикл While not terminated do , далее не может в него войти. И пытается прибиться при помощи FreeOnTerminate. Результат, вся программа в накауте. |
28.11.2011, 12:33 | #10 |
Форумчанин
Регистрация: 16.12.2009
Сообщений: 902
|
В твоем коде.
Код:
Лучше сделай отдельное создание и освобождение ресурсов не в процессе работы потока добавь в параметры потока следующие строки Код:
Код:
Код:
Код:
Последний раз редактировалось Aliens_wolfs; 28.11.2011 в 15:23. |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
при закрытии потока(Tthread) посылать на форму код ответа или сообщение | Человек_Борща | Общие вопросы Delphi | 2 | 14.12.2010 21:19 |
Работа с TThread | pesi | Общие вопросы Delphi | 2 | 09.08.2010 14:12 |
TThread | Vladislav_I | Общие вопросы Delphi | 0 | 30.04.2010 19:47 |
Ошибка при OpenDialog.Execute | ymka2 | Общие вопросы Delphi | 10 | 27.11.2009 14:15 |
TThread и GUI | Freezer | Общие вопросы Delphi | 8 | 05.08.2009 11:50 |