Как быстро процесс появляется в списке процессов?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Cellard
Новичок
Новичок
 
Сообщения: 49
Зарегистрирован: 15.10.2002 (Вт) 22:10
Откуда: Russia

Как быстро процесс появляется в списке процессов?

Сообщение Cellard » 30.01.2004 (Пт) 19:22

Моя программа запускает N приложений. Не сразу, одно за другим. Ждет завершения. По таймауту снимает процесс.
Ждет завершения перебором активных процессов. Если моего процесса в списке нет, то считает что оно успешно завершилось и запускает следующее.
Это все были очевидные вещи.

Теперь проблема:
На всех машинах это все работает. Но однажды я запустил программу на очень заторможенной машине. Не старой, а на ОЧЕНЬ-ОЧЕНЬ перегруженной. На ней калькулятор секунд 15 закружается. И моя программа стала запускать приложения одно за другим не дожидаясь их завершения. Из чего я делаю вывод, что она начинает смотреть процессы ДО того, как там появляется запущенное приложение.

Посоветуйте алгоритм.
Либо ждать, пока в списке процессов не появится мой процесс, а потом ждать его завершения.
Либо ждать его появления в списке с таймаутом (вдруг вообще не появится :))
Cellard

Vasya
Обычный пользователь
Обычный пользователь
 
Сообщения: 69
Зарегистрирован: 23.04.2002 (Вт) 16:49
Откуда: Togo

Сообщение Vasya » 31.01.2004 (Сб) 9:11

Waitforsingleobject(createprocess(calc))

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 31.01.2004 (Сб) 10:03

А вот и ни фига...
CreateProcess не возвращает хэндл процесса, а возвращает BOOL Success/Fail. Но мысль в правильном направлении.
Вызываем CreateProcess. Ему надо передать указатель на структуру PROCESS_INFORMATION, которую он заполнит при создании процесса. В этой структуре есть hProcess As Long, вот потом и вызываем waitforsingleobject(struct.hProcess, Timeout).
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Cellard
Новичок
Новичок
 
Сообщения: 49
Зарегистрирован: 15.10.2002 (Вт) 22:10
Откуда: Russia

Сообщение Cellard » 31.01.2004 (Сб) 13:25

Сильно! Я ни фига не понял :)

Можно ли делать это по-простому?
Shell'ом запускаю приложение.
EnumProcess получаю список процессов. Если моего ProcessID нет, то через N [милли]секунд опять беру список процессов и ищу свой?
Cellard

Vasya
Обычный пользователь
Обычный пользователь
 
Сообщения: 69
Зарегистрирован: 23.04.2002 (Вт) 16:49
Откуда: Togo

Сообщение Vasya » 01.02.2004 (Вс) 11:57

Shell вроде возвращает PID, значит можно сделать так:
waitforsingleobject(Shell(наша программа), Timeout).
Только Shell не везде работает как надо, поэтому слушай что умные люди советуют :)

Cellard
Новичок
Новичок
 
Сообщения: 49
Зарегистрирован: 15.10.2002 (Вт) 22:10
Откуда: Russia

Сообщение Cellard » 01.02.2004 (Вс) 16:09

то есть лучше createprocess и затем его wait? а потом уже ждать завершения... все верно?
Cellard

Vasya
Обычный пользователь
Обычный пользователь
 
Сообщения: 69
Зарегистрирован: 23.04.2002 (Вт) 16:49
Откуда: Togo

Сообщение Vasya » 02.02.2004 (Пн) 5:29

Вроде верно


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

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

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

    TopList