Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

WinExec [D5, D6, Win95/98, WinXP]


Andrew K.S. ©   (2002-03-26 12:34:00) 

Я используу субж для вызова утилитки а та в свою очередь вызывает
еще одну прогу с графической оболочкой как мне отследить когда она заканчивает работу??? Так как первая прога передает ей в качестве парамеров массив файлов и она делает это в цикле что приводить к седанию всей памяти.


Севостьянов Игорь   (2002-03-26 13:16:00) [1]

Да совсем заморочился можно же и по другому зная Handle окна (как найти уже не раз писали)

DWORD GetWindowThreadProcessId(
HWND hWnd, // handle to window
LPDWORD lpdwProcessId // process identifier
);

----------
{ Ожидаем завершения приложения }
begin
if GetWindowThreadProcessId(hWindow, hProcess) <> 0 then
repeat
if hProcess = 0 then
begin
R := WAIT_FAILED;
Break;
end;
R := WaitForSingleObject(hProcess, 100); // ожидаем 100 миллисекунд
if R = WAIT_TIMEOUT then
begin
Repaint; // Перерисовываем твою форму
end;
until (R = WAIT_OBJECT_0) or (R = WAIT_ABANDONED) or (R = WAIT_FAILED);

Result := (R = WAIT_OBJECT_0); // Результат выполнения ОК ?
end;
----------



Севостьянов Игорь   (2002-03-26 13:05:00) [2]

Тебе надо будет искать для второй проги handle to process (hProcess)+ thread identifier (dwThreadId)

Процедура нахождения окна по Handle процесса

function EnumThreadWndProc(Handle: THandle; lParam: Longint): Boolean; stdcall;
begin
hWindow := Handle;
Result := False;
end;


----------
{ Ожидаем завершения приложения }
begin
hWindow := 0; // сюда будем заносить handle окна второй проги
WaitForInputIdle(hProcess, INFINITE); // ожидаем запуска ее, чтобы не пропустить мимо ушей
EnumThreadWindows(dwThreadId, @EnumThreadWndProc, 0);
repeat
R := WaitForSingleObject(hProcess, 100); // ожидаем 100 миллисекунд
if R = WAIT_TIMEOUT then
begin
Repaint; // Перерисовываем твою форму
end;
until (R = WAIT_OBJECT_0) or (R = WAIT_ABANDONED) or (R = WAIT_FAILED);

Result := (R = WAIT_OBJECT_0); // Результат выполнения ОК ?
end;
----------

Но можно обойтись и двумя:
WaitForInputIdle(hProcess, INFINITE);
WaitForSingleObject(hProcess, INFINITE);


Все вопросы по мылу...


Наверх

Титульная страница Поиск, карта сайта Написать письмо