|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
14.07.2011, 13:57 | #1 |
Сумрачная тень
Форумчанин
Регистрация: 05.03.2009
Сообщений: 689
|
Ожидание завершения потока при выключении службы
Здравствуйте. Есть служба, в ней работает серверный поток подключений по tcp. Как правильно реализовать, чтобы при завершении работы служба ждала завершения работы слушающего потока подключений, и пока последний не завершится, выход не произойдет. Слушающий поток может завершаться некое время, т.к. ожидает завершения работы клиентских потоков (конечная запись данных, завершение соединения и т.п.).
Такой код приводит к зависанию службы: Код:
Надеюсь, объяснил доходчиво. Буду рад предложенным решениям!
"ковыряю изнутри" (с)
|
14.07.2011, 14:04 | #2 |
Старожил
Регистрация: 30.12.2009
Сообщений: 11,426
|
скм будет считать, что сервис не работает, только после того как вы установите Stopped:=true.
|
14.07.2011, 15:41 | #3 |
Сумрачная тень
Форумчанин
Регистрация: 05.03.2009
Сообщений: 689
|
т.е. если я в событии сразу поставлю Stopped:=true, то этот код выполнится?
"ковыряю изнутри" (с)
|
14.07.2011, 15:50 | #4 |
Сумрачная тень
Форумчанин
Регистрация: 05.03.2009
Сообщений: 689
|
к сожалению не работает. Без разницы, если вставляю Stopped:=True в начале или в конце. Что-то не так делаю?
"ковыряю изнутри" (с)
|
14.07.2011, 16:08 | #5 |
Старожил
Регистрация: 03.01.2011
Сообщений: 2,508
|
> Что-то не так делаю?
Вызов FTcpServerThread.Terminate() просто выставляет Terminated в True. Внутри FTcpServerThread.Execute() это свойство нужно переодически проверять. Если такой проверки нет, WaitFor() никогда не вернёт управление.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
|
14.07.2011, 16:15 | #6 |
Сумрачная тень
Форумчанин
Регистрация: 05.03.2009
Сообщений: 689
|
есть проверка, цикл while not terminated do...
"ковыряю изнутри" (с)
|
14.07.2011, 16:26 | #7 |
Старожил
Регистрация: 03.01.2011
Сообщений: 2,508
|
тогда нужен лог в точках:
- перед выходом из Execute(), чтобы знать, что поток завершился - сразу после входа и перед выходом из ServiceStop() иначе можно долго гадать, где кто виснет.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
|
14.07.2011, 16:35 | #8 |
Сумрачная тень
Форумчанин
Регистрация: 05.03.2009
Сообщений: 689
|
ок... попробую. А вообще скажем если просто приложение, то это решается легко. Но вот как быть в случае со службой... тут же особенности реализации...
"ковыряю изнутри" (с)
|
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 |
Пользователь
Регистрация: 09.03.2010
Сообщений: 48
|
вообще рекомендация на такую затею одна- служба отдельно, приложение к ней отдельно. Не помню где вычитал, но реально проще их так развести и сообщениями чтобы перекидывались и все.
Сам сталкивался недавно с таким. просто проще и красивее |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Ожидание завершения потоков | 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 |