Форум: "Основная";
Текущий архив: 2005.09.25;
Скачать: [xml.tar.bz2];
ВнизКак дождаться окончание работы вызываемого приложения ? Найти похожие ветки
← →
Som (2005-09-02 15:17) [0]Необходимо запустить приложение, дождаться его выполнения и после выполнить определённые действия. Вопрос именно в том, как дождаться оканчание работы приложения?
← →
wal © (2005-09-02 15:19) [1]
> Вопрос именно в том, как дождаться оканчание работы приложения?
Для начала, вопрос в том, как запускаешь?
С уважением.
← →
begin...end © (2005-09-02 15:19) [2]CreateProcess + WaitForSingleObject
← →
Som (2005-09-02 15:23) [3]запускал WinExec-ом, но он же не ждёт окончания работы приложения
← →
wal © (2005-09-02 15:32) [4]
> запускал WinExec-ом,
Хелп по ней читал? Там написано:
This function is provided for compatibility with earlier versions of Windows. For Win32-based applications, use the CreateProcess function.
← →
Gydvin © (2005-09-02 15:39) [5]От Озерова
Определение окончания работы другого приложения
WinExec сразу после запуска приложения возвращает его дескриптор. Для определения завершения программы вы должны вызывать функцию GetModuleUsage(InstanceID), где InstanceID - дескриптор запущенного функцией WinExec приложения. Если возвращаемый результат содержит ноль, приложение завершило свою работу. Сделайте проверку в таймерном цикле и задача решена.
← →
Gydvin © (2005-09-02 15:41) [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);
← →
Хинт © (2005-09-02 15:44) [7]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;
← →
Fay © (2005-09-02 16:02) [8]2 Хинт © (02.09.05 15:44) [7]
>CloseHandle( pi.hProcess );
> CloseHandle( pi.hThread );
Думаю, стоит поменять порядок 8)
← →
begin...end © (2005-09-02 16:06) [9]> Fay © (02.09.05 16:02) [8]
Зачем?
← →
Som (2005-09-02 17:27) [10]спасибо всем, всё получилось
← →
Eraser © (2005-09-02 17:59) [11]Gydvin © (02.09.05 15:39) [5]
под win32 лучше так не делать.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.09.25;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.034 c