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

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

Как дождаться окончание работы вызываемого приложения ? [D6, WinXP]


Som ©   (2005-09-02 15:17:00) 

Необходимо запустить приложение, дождаться его выполнения и после выполнить определённые действия. Вопрос именно в том, как дождаться оканчание работы приложения?


Eraser   (2005-09-02 17:59:00) [1]

Gydvin ©   (02.09.05 15:39) [5]

под win32 лучше так не делать.


Som   (2005-09-02 17:27:00) [2]

спасибо всем, всё получилось


begin...end   (2005-09-02 16:06:00) [3]

> Fay ©   (02.09.05 16:02) [8]

Зачем?


Fay   (2005-09-02 16:02:00) [4]

2 Хинт ©   (02.09.05 15:44) [7]
>CloseHandle( pi.hProcess );
> CloseHandle( pi.hThread );


Думаю, стоит поменять порядок 8)


Хинт   (2005-09-02 15:44:00) [5]

var
 si:STARTUPINFO;
 pi:PROCESS_INFORMATION;
...
begin
ZeroMemory(@si,sizeof(si));
si.cb:=SizeOf(si);
cmdline:='C:\my.exe';
if not CreateProcess( nil, PChar(cmdline), nil, nil, False, 0, nil, nil, si, pi) then ...
WaitForSingleObject( pi.hProcess, INFINITE );
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
...
end;


Gydvin   (2005-09-02 15:41:00) [6]

От него же

Как мне запустить какую-нибудь программу? А как подождать, пока эта программа не отработает? Как выяснить, работает ли программа или уже завершилась? Как принудительно закрыть выполняющуюся программу?

Nomadic рекомендует следующее:
A: WinExec() или ShellExecute. У второй больше возможностей.

(SO): CreateProcess() в параметре process info возвращает handle запущенного процесса. Вот и делаешь WaitForSingleObject(pi.hProcess, INFINITE);

(AA): (Win16) Delay можно взять из rxLib.

--------------------------------------------------------------------------------
   handle := WinExec(...);
if handle >= 32 then
while GetModuleUsage(handle) > 0 do
Delay( nn );
else

raise ....  

(AM): Чтобы выяснить, работает ли программа, используйте GetProcessTimes(), параметр lpExitTime.

(Win32) Для принудительного завершения процесса -- TerminateProcess.

(Win16) (RR): Надо послать программе сообщение WM_QUIT:

--------------------------------------------------------------------------------
   Handle := Winexec(App, 0);
PostMessage(Handle, WM_QUIT, 0, 0);


Gydvin   (2005-09-02 15:39:00) [7]

От Озерова

Определение окончания работы другого приложения
WinExec сразу после запуска приложения возвращает его дескриптор. Для определения завершения программы вы должны вызывать функцию GetModuleUsage(InstanceID), где InstanceID - дескриптор запущенного функцией WinExec приложения. Если возвращаемый результат содержит ноль, приложение завершило свою работу. Сделайте проверку в таймерном цикле и задача решена.


wal   (2005-09-02 15:32:00) [8]


> запускал WinExec-ом,
Хелп по ней читал? Там написано:
This function is provided for compatibility with earlier versions of Windows. For Win32-based applications, use the CreateProcessfunction.


Som   (2005-09-02 15:23:00) [9]

запускал WinExec-ом, но он же не ждёт окончания работы приложения


wal   (2005-09-02 15:19:00) [10]


> Вопрос именно в том, как дождаться оканчание работы приложения?
Для начала, вопрос в том, как запускаешь?

С уважением.


begin...end   (2005-09-02 15:19:00) [11]

CreateProcess + WaitForSingleObject


Наверх

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