WMI :: Остановить NextEvent

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
AjaxVS
Постоялец
Постоялец
 
Сообщения: 506
Зарегистрирован: 01.12.2004 (Ср) 13:12
Откуда: Donetsk, Battle.Net

WMI :: Остановить NextEvent

Сообщение AjaxVS » 23.05.2006 (Вт) 18:28

В общем, прога следит за запуском процессов.
На форме - одна кнопка. По нажатии на нее статистика начинается. Как только какой-то процесс запуститься, высвечивается MsgBox.

Пытался сделать возможность остановки статистики (в коде это легко можно заметить), но ничего не получается - программа ждет события в строчке "Set oE = oQ.nextevent" и не реагирует на нажатие кнопки (Command1).

В общем, как сделать так, чтоб форма обрабатывала события в той строке? Варианты использования таймера не предлагать (длительность процесса м.б. меньше минимального интервала таймера + много др. нюансов).

Код: Выделить всё
Dim b_RunStat As Boolean

Private Sub Command1_Click()
b_RunStat = Not b_RunStat
If b_RunStat Then funGo
End Sub

Sub funGo()
Dim WMI, oQ, oE
Set WMI = GetObject("winmgmts:")
Set oQ = WMI.ExecNotificationQuery("select * from __InstanceCreationEvent within 1 where TargetInstance ISA 'Win32_Process'")
Do
DoEvents
If b_RunStat = False Then
  Exit Do
End If
Set oE = oQ.nextevent
MsgBox oE.targetinstance.Name
Loop
End Sub

Private Sub Form_Load()
b_RunStat = False
End Sub
Вложения
WMI_NextEvent_test.zip
Исходники.
Кстати, завершить программу вы сможете только через Ctrl+Break при MsgBox-е
(1.34 Кб) Скачиваний: 15

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 23.05.2006 (Вт) 18:32

В параллельный процесс засунуть "Set oE = oQ.nextevent"?

AjaxVS
Постоялец
Постоялец
 
Сообщения: 506
Зарегистрирован: 01.12.2004 (Ср) 13:12
Откуда: Donetsk, Battle.Net

Сообщение AjaxVS » 23.05.2006 (Вт) 18:36

(отредактировано мной)

Как оказалось, все очень просто - надо создать таймер, по событию которого происходит DoEvents, а в коде funGo() после NextEvent-a сделать несколько циклов (For) DoEvents-a и Sleep-a.

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 24.05.2006 (Ср) 0:16

1 сек по процам? ты кады последний раз в TaskManager заглядывал?
На загрузку проца посмотри...
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

AjaxVS
Постоялец
Постоялец
 
Сообщения: 506
Зарегистрирован: 01.12.2004 (Ср) 13:12
Откуда: Donetsk, Battle.Net

Сообщение AjaxVS » 24.05.2006 (Ср) 1:44

Ха!
Раз в секунду прога проверяет, не был ли запущен какой-нить процесс. Если запущен, то с помощью DAO я его отыскиваю в БД, и инкрементирую соответствующий счетчик (или создаю новую запись).
Кроме этого еще и вывожу все это в FlexGrid.
Все за 1 секунду +_+

Загруженность проца = 0. Памяти правда уже 9 мег жрет..

Мне бы еще научиться сортировать базу с DAO по полю счетчика (не найду нигде - как?) и найти другое решение сабжа топика (а то работает через раз =(()

В общем, вопрос опять открыт..


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 59

    TopList