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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.07.2011, 13:57   #1
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
Вопрос Ожидание завершения потока при выключении службы

Здравствуйте. Есть служба, в ней работает серверный поток подключений по tcp. Как правильно реализовать, чтобы при завершении работы служба ждала завершения работы слушающего потока подключений, и пока последний не завершится, выход не произойдет. Слушающий поток может завершаться некое время, т.к. ожидает завершения работы клиентских потоков (конечная запись данных, завершение соединения и т.п.).
Такой код приводит к зависанию службы:
Код:
  FTcpServerThread.FreeOnTerminate:=False;
...
procedure TMyService.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
  FTcpServerThread.Terminate;
  FTcpServerThread.WaitFor; //видимо здесь служба перестает обрабатывать сообщения SCM и умирает
  FreeAndNil(FTcpServerThread);
end;
Теоретически, насколько я понимаю, зависания быть не должно, т.к. обработкой сообщений занимается поток TServiceThread. А WaitFor вызывает главный поток службы... Поправьте меня, если не прав.
Надеюсь, объяснил доходчиво. Буду рад предложенным решениям!
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Старый 14.07.2011, 14:04   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

скм будет считать, что сервис не работает, только после того как вы установите Stopped:=true.
Человек_Борща вне форума Ответить с цитированием
Старый 14.07.2011, 15:41   #3
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

т.е. если я в событии сразу поставлю Stopped:=true, то этот код выполнится?
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Старый 14.07.2011, 15:50   #4
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

к сожалению не работает. Без разницы, если вставляю Stopped:=True в начале или в конце. Что-то не так делаю?
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Старый 14.07.2011, 16:08   #5
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> Что-то не так делаю?

Вызов FTcpServerThread.Terminate() просто выставляет Terminated в True.
Внутри FTcpServerThread.Execute() это свойство нужно переодически проверять.
Если такой проверки нет, WaitFor() никогда не вернёт управление.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 14.07.2011, 16:15   #6
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

есть проверка, цикл while not terminated do...
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Старый 14.07.2011, 16:26   #7
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

тогда нужен лог в точках:
- перед выходом из Execute(), чтобы знать, что поток завершился
- сразу после входа и перед выходом из ServiceStop()

иначе можно долго гадать, где кто виснет.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 14.07.2011, 16:35   #8
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

ок... попробую. А вообще скажем если просто приложение, то это решается легко. Но вот как быть в случае со службой... тут же особенности реализации...
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Старый 14.07.2011, 16:48   #9
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Что вам делать? Логи, логи, логи и только логи. Никакой интерактивности..
Только логи.

Вот там и фиксируйте все что происходит.

p.S. сам недавно писал приложение-службу в котрой выполнялся поток tthread.
то ещё развлечение.....

Последний раз редактировалось Человек_Борща; 14.07.2011 в 17:28.
Человек_Борща вне форума Ответить с цитированием
Старый 19.07.2011, 17:48   #10
Dee63
Пользователь
 
Аватар для Dee63
 
Регистрация: 09.03.2010
Сообщений: 48
По умолчанию

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

Сам сталкивался недавно с таким. просто проще и красивее
Dee63 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ожидание завершения потоков Voody Общие вопросы Delphi 11 14.06.2016 06:10
ожидание завершения работы макроса -Anton- Microsoft Office Excel 15 18.06.2011 18:17
Синий экран при выключении bookkc Помощь студентам 2 19.11.2010 14:59
Ожидание завершения процесса Человек-Ололо Общие вопросы Delphi 2 08.03.2010 19:39
Использование метода free после завершения потока Denager Общие вопросы Delphi 4 29.08.2008 10:13