Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.07.2015, 03:20   #1
vipok72
Пользователь
 
Регистрация: 26.07.2015
Сообщений: 59
По умолчанию Завершение работы потока

Всех приветствую, у меня возникла проблема с завершением работы потока, дело в том что корректно проверить работает ли поток я не могу, поэтому хочу перезапускать его принудительно,
Код:
TNewThread.Create(false);
Вот так запускаю поток, а как завершить его не из самого потока.
Прошу обьяснить мне как завершить поток.
Еще было бы супер если бы вы подсказали как проверить работает ли поток в данный момент
Заранее спасибо
vipok72 вне форума Ответить с цитированием
Старый 28.07.2015, 08:39   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
как проверить работает ли поток в данный момент
У него есть свойство Terminated. Попробуй его проверять.
Цитата:
как завершить поток.
В ХЕ делфи вроде был метод Stop. Нужно в доках по Эмбаркадеро посмотреть, если у тебя ХЕ. Если нет то в потоке организуй какой нить флаг-переменку, в которую можно писать извне потока. Если в нее пишешь false - поток завершай командой Exit к примеру. Лично я так и делаю. Ну или грубо - TerminateThread()
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 28.07.2015, 08:50   #3
vipok72
Пользователь
 
Регистрация: 26.07.2015
Сообщений: 59
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
У него есть свойство Terminated. Попробуй его проверять.
По моему из вне - нельзя проверять, ну то есть с основного окна, можно только из самого потока как я помню... читал про это где то...

Цитата:
Сообщение от Stilet Посмотреть сообщение
В ХЕ делфи вроде был метод Stop. Нужно в доках по Эмбаркадеро посмотреть, если у тебя ХЕ. Если нет то в потоке организуй какой нить флаг-переменку, в которую можно писать извне потока. Если в нее пишешь false - поток завершай командой Exit к примеру. Лично я так и делаю. Ну или грубо - TerminateThread()
У меня Borland Delphi 7, насчет флага я уже сделал... дело в том что возможны ошибки в работе потока, и он завершится, и мне нужно будет перезапустить его... Самый кайф в том что я гружу потоком страницу, возможно иногда будут таймауты, а это считается ошибкой, поток вылетает... как проверить - не знаю, даже с помощью динамического флага например (собстна так я щас и проверяю)... ибо я не зная что поток работает долго загружая страницу, могу запустить второй раз поток, а это ни к чему, так что желательно проверить работает ли поток или нет из вне, или же принудительно завершить его и запустить снова
vipok72 вне форума Ответить с цитированием
Старый 28.07.2015, 09:56   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
дело в том что возможны ошибки в работе потока
Можно не проверять, а "договориться" с потоком чтобы он "сообщал" о СВОИХ проблемах!
ПУСТЬ поток САМ ловит все ошибки
Код:
try
while not terminted do begin
..........
end;
except
Synconize(sendStopExcept);
end;
И сообщает о них а основная программа реагирует на такие сообщения и ....
пример использования OnTermiante для общения
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 28.07.2015 в 10:22.
evg_m вне форума Ответить с цитированием
Старый 28.07.2015, 16:46   #5
Krasiosoft
Форумчанин
 
Аватар для Krasiosoft
 
Регистрация: 01.06.2015
Сообщений: 497
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Ну или грубо - TerminateThread()
У грубого метода свои последствия, а если точнее, то поток может не освободить память, которую выделял для своих нужд, так не стоит делать.
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).
Krasiosoft вне форума Ответить с цитированием
Старый 28.07.2015, 17:02   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Ну да. На то оно и грубо, чтоб die hard
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 28.07.2015, 18:20   #7
саша40
Участник клуба
 
Регистрация: 12.09.2012
Сообщений: 1,030
По умолчанию

EndThread попробуй.
Что нужно программисту: Компьютер, Среда программирование, Воображение, Прямые руки, Мозги, Знания этой среды программирования.
Программист-это профессия, а программирование-это моё хобби.
саша40 вне форума Ответить с цитированием
Старый 30.07.2015, 10:13   #8
SQLPowerUser
Форумчанин
 
Аватар для SQLPowerUser
 
Регистрация: 19.01.2015
Сообщений: 158
Стрелка На всякий случай

В другом форуме по Delphi, есть тема Шаблон класса для работы с потоком (WThread, Thread).
Модуль позволяет "общаться" дополнительному и основному потокам посредством очереди сообщений
В архиве пример с пояснениями, может кому пригодится...
SQLPowerUser вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Delphi Завершение потока bilibian Общие вопросы Delphi 22 02.02.2023 05:52
Завершение потока coNsept Общие вопросы C/C++ 3 20.06.2012 19:42
Принудительное завершение потока не работает :(! TEED! Работа с сетью в Delphi 3 06.06.2012 14:34
C# BackgroundWorker - завершение работы потока Lastsummer Помощь студентам 2 16.03.2011 18:04
Как отследить завершение выполнения потока TThread? Трик Общие вопросы Delphi 3 24.10.2007 14:55