Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

остановка сервиса. [D1, Win95/98]


SergeyDon ©   (2005-07-12 15:23:00) 

запускаю сервис в котором стартует дополнительный поток считает там разную ерунду, в ServiceExecute ожидаю завершение этого потока: WaitForMultipleObjects(3,...,INFINITE);
когда поток обработал пробуждаемся и идем дальше!
Вопрос в момент когда выполняется ожидание WaitForMultipleObjects
система не реагирует на Stop как правильно остановить выполнение serviсe?. (точнее реагирует постановкой в очередь сообщений силнала Stop, и останавливает когда произошло пробуждение основного потока.)


Digitman   (2005-07-12 16:24:00) [1]


> EventsArray:array of THandle; //масив Handle`ов потоков


это динамическиймассив !!

переменная, его определяющая, есть суть указатель на управляющую структуру масива, а не на собственно данные элементов массива


> PWOHandleArray - это приведение масива EventsArray к требованию
> SDK


в SDK нет ни слова ни  про какие-то там динамическиемассивы.


SergeyDon   (2005-07-12 16:09:00) [2]

в первом посте 3 набрал случайно там 2 потока.

EventsArray:array of THandle; //масив Handle`ов потоков

PWOHandleArray - это приведение масива EventsArray к требованию SDK

все разабрался в MsgWaitForMultipleObjects это должен быть просто указатель на масив Handle`ов, а не преобразованный.
но все равно Stop срабатывает после окончания работы потока.


Digitman   (2005-07-12 16:06:00) [3]


> изменил одну строчку, остальной код прежний


даже если бы ты правильно изменил одну строчку, этого недостаточно для реализации сабжа

под реакцией на сообщения подразумевается немедленное "пробуждение" трэда, "спящего" на wait-вызове, всякий раз когда очередт сообщений трэду (и/или его окнам) непуста ... а выбирать/диспетчеризовать/обрабатывать эти сообщения кто за тебя будет ? Пушкин ?

см. TServiseThread.ProcessRequests()


SergeyDon   (2005-07-12 16:00:00) [4]

to Bin:

что это может значить?
изменил одну строчку, остальной код прежний.
вылетает сразу, кнопку stop  не нажимаю.


Digitman   (2005-07-12 15:56:00) [5]


> SergeyDon   (12.07.05 15:51) [4]


и я по-твоему должен гадать на кофейной гуще, что у тебя есть PWOHandleArray и что есть Eventsarray ?

И почему в оригинальном варианте в массиве ивентов было 3 элемента, а в msg-варианте вдруг их стало 2 ?


> QS_INPUT


ставь QS_ALLINPUT - не ошибешься


BiN   (2005-07-12 15:54:00) [6]

SergeyDon   (12.07.05 15:51) [4]

вылетает с ошибкой WAIT_FAILED, GetLasterror = 6


The handle is invalid.


SergeyDon   (2005-07-12 15:51:00) [7]

to Digitman:
поставил:

msgWaitForMultipleObjects(2,PWOHandleArray(Eventsarray),false,INFINITE,QS_INPUT);
QS_INPUT - обробатывать также входные сообщения в очереди.

вылетает с ошибкой WAIT_FAILED, GetLasterror = 6


BiN   (2005-07-12 15:51:00) [8]

Lamers   (12.07.05 15:38) [2]

а смысл еще поток плодить?
может просто INFINITE заменить но 100 , это даст возможность обрабатывать очередь.


Проблемы могут возникнуть при необходимости ожидания на какой-нибудь период отличный от 100 или INFINITE (например 3000).

В любом случае в [3] уже дано оптимальное решение для TServiceApplication.


Digitman   (2005-07-12 15:41:00) [9]

MsgWaitForMultipleObjects

тем самым Msgты сделаешь трэд сервиса реагирующим на поступающие в его адрес сообщения, в т.ч. стоп-сигнал

др.вопрос что, даже отреагировав на это сообщение и обработав его, нужно таки все равно дождаться завершения того самого доп.трэда ... только в этом случае ожидание необходимо будет перенести в обработчик OnStop


Lamers   (2005-07-12 15:38:00) [10]

to BiN ©
а смысл еще поток плодить?
может просто INFINITE заменить но 100 , это даст возможность обрабатывать очередь.


BiN   (2005-07-12 15:30:00) [11]

Организовать ожидание в другом потоке.


Наверх

Титульная страница Поиск, карта сайта Написать письмо