Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.09.25;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.042 c
14-1125377598
stud
2005-08-30 08:53
2005.09.25
литература по SQL SERVER 2000


14-1125632791
Rentgen
2005-09-02 07:46
2005.09.25
админ запретил юзергейтом MP3


14-1125395286
NeyroSpace
2005-08-30 13:48
2005.09.25
Рожденный ползать - летать не может?


1-1125474099
lock
2005-08-31 11:41
2005.09.25
TBitmap в TSream


14-1125082478
raymond
2005-08-26 22:54
2005.09.25
Прграмма - репозиторий данных