![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
остановка сервиса. [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]Организовать ожидание в другом потоке.