![]() |
|
Модераторы: ginnie, korob2001 |
![]()
|
|
| Ramirez |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 305 Регистрация: 18.1.2005 Где: Moscow, ExUSSR Репутация: нет Всего: 5 |
Доброго всем дня!
Обращаюсь к коллективному разуму, работавшему с WMI Есть скрипт слушающий некие события WMI вида:
работает абсолютно линейно, цикл ждет событие, делает что-то и опять ждет. есть служба на базе Win32::Daemon, вида:
логика работы Win32::Daemon исползует callback'и. процедура Callback_Running вызывается каждые 2 секунды, в ней предполагается быстро сделать небольшую часть полезной работы и вернуть управление в Win32::Daemon. а мне необходимо слушать WMI события. я не могу в &Callback_Running вызвать прослушивание WMI не заблокировав службу. Она будет обрабатывать мои события, но перестанет быть управляемой и перестанет отвечать на сигналы Service Control Manager, и он решит что она висит. как асинхронно обрабатывать события NotificationQuery из WMI? я пробовал в &Callback_Running делать нечто вида:
тогда, по идее, код ждет события 500-1000 миллисекунд, если не получает его, то возвращает управление в Win32::Daemon. но у меня есть основания полагать, что: - это неправильный подход и часть событий, происходящих между вызовами &Callback_Running теряется. - при неудачном стечении обстоятельств/потоке событий он никогда не выйдет из этого цикла Поделитесь опытом/соображениями. - как правильно в такой ситуации обрабатывать события NotificationQuery из WMI? - ExecNotificationQuery() кеширует события если я не успеваю их забирать через NextEvent()? Это сообщение отредактировал(а) Ramirez - 20.10.2011, 21:54 |
||||||
|
|||||||
| Ramirez |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 305 Регистрация: 18.1.2005 Где: Moscow, ExUSSR Репутация: нет Всего: 5 |
Ну что-же, поскольку внятного ответа не нашел, поделюсь своими наблюдениями
объект wmi, видимо, всетаки кеширует данные в ожидании вызова NextEvent(). Поэтому имеет смысл всегда вызывать NextEvent() до тех пор, пока оно не вернет пустоту. Неизвестно, правда, сколько в этот кеш влезает и как посмотреть его состояние. на основании наблюдений, получился рабочий код вида:
пока тестирую, но вроде все работает корректно, события не теряются. |
|||
|
||||
![]()
|
| Правила форума "Perl: Системное программирование" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Perl: Системное программирование | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |