Форум: "WinAPI";
Текущий архив: 2005.08.28;
Скачать: [xml.tar.bz2];
Внизостановка сервиса. Найти похожие ветки
← →
SergeyDon (2005-07-12 15:23) [0]запускаю сервис в котором стартует дополнительный поток считает там разную ерунду, в ServiceExecute ожидаю завершение этого потока: WaitForMultipleObjects(3,...,INFINITE);
когда поток обработал пробуждаемся и идем дальше!
Вопрос в момент когда выполняется ожидание WaitForMultipleObjects
система не реагирует на Stop как правильно остановить выполнение serviсe?. (точнее реагирует постановкой в очередь сообщений силнала Stop, и останавливает когда произошло пробуждение основного потока.)
← →
BiN © (2005-07-12 15:30) [1]Организовать ожидание в другом потоке.
← →
Lamers (2005-07-12 15:38) [2]to BiN ©
а смысл еще поток плодить?
может просто INFINITE заменить но 100 , это даст возможность обрабатывать очередь.
← →
Digitman © (2005-07-12 15:41) [3]MsgWaitForMultipleObjects
тем самым Msg ты сделаешь трэд сервиса реагирующим на поступающие в его адрес сообщения, в т.ч. стоп-сигнал
др.вопрос что, даже отреагировав на это сообщение и обработав его, нужно таки все равно дождаться завершения того самого доп.трэда ... только в этом случае ожидание необходимо будет перенести в обработчик OnStop
← →
SergeyDon (2005-07-12 15:51) [4]to Digitman:
поставил:
msgWaitForMultipleObjects(2,PWOHandleArray(Eventsarray),false,INFINITE,QS_INPUT);
QS_INPUT - обробатывать также входные сообщения в очереди.
вылетает с ошибкой WAIT_FAILED, GetLasterror = 6
← →
BiN © (2005-07-12 15:51) [5]Lamers (12.07.05 15:38) [2]
а смысл еще поток плодить?
может просто INFINITE заменить но 100 , это даст возможность обрабатывать очередь.
Проблемы могут возникнуть при необходимости ожидания на какой-нибудь период отличный от 100 или INFINITE (например 3000).
В любом случае в [3] уже дано оптимальное решение для TServiceApplication.
← →
BiN © (2005-07-12 15:54) [6]SergeyDon (12.07.05 15:51) [4]
вылетает с ошибкой WAIT_FAILED, GetLasterror = 6
The handle is invalid.
← →
Digitman © (2005-07-12 15:56) [7]
> SergeyDon (12.07.05 15:51) [4]
и я по-твоему должен гадать на кофейной гуще, что у тебя есть PWOHandleArray и что есть Eventsarray ?
И почему в оригинальном варианте в массиве ивентов было 3 элемента, а в msg-варианте вдруг их стало 2 ?
> QS_INPUT
ставь QS_ALLINPUT - не ошибешься
← →
SergeyDon (2005-07-12 16:00) [8]to Bin:
что это может значить?
изменил одну строчку, остальной код прежний.
вылетает сразу, кнопку stop не нажимаю.
← →
Digitman © (2005-07-12 16:06) [9]
> изменил одну строчку, остальной код прежний
даже если бы ты правильно изменил одну строчку, этого недостаточно для реализации сабжа
под реакцией на сообщения подразумевается немедленное "пробуждение" трэда, "спящего" на wait-вызове, всякий раз когда очередт сообщений трэду (и/или его окнам) непуста ... а выбирать/диспетчеризовать/обрабатывать эти сообщения кто за тебя будет ? Пушкин ?
см. TServiseThread.ProcessRequests()
← →
SergeyDon (2005-07-12 16:09) [10]в первом посте 3 набрал случайно там 2 потока.
EventsArray:array of THandle; //масив Handle`ов потоков
PWOHandleArray - это приведение масива EventsArray к требованию SDK
все разабрался в MsgWaitForMultipleObjects это должен быть просто указатель на масив Handle`ов, а не преобразованный.
но все равно Stop срабатывает после окончания работы потока.
← →
Digitman © (2005-07-12 16:24) [11]
> EventsArray:array of THandle; //масив Handle`ов потоков
это динамический массив !!
переменная, его определяющая, есть суть указатель на управляющую структуру масива, а не на собственно данные элементов массива
> PWOHandleArray - это приведение масива EventsArray к требованию
> SDK
в SDK нет ни слова ни про какие-то там динамические массивы.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2005.08.28;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.049 c