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

Вниз

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

 
TStas ©   (2005-10-18 20:03) [0]

Как отследить прекращение работы консольного приложения? Запускается оно через ShellExecute Какие-то ветки про это были, но найти не получается


 
wicked ©   (2005-10-18 20:42) [1]

запускать через ShellExecuteEx или CreateProcess... 1-е - легче, 2-е - мощнее...
обе функции хорошо описаны в msdn....


 
wicked ©   (2005-10-18 20:45) [2]

то есть, нужно эти функции использовать с WaitForSingleObject - тогда счастье наступит...


 
Piter ©   (2005-10-18 20:57) [3]

Вопрос: как запустить другую программу и дождаться ее окончания.

Ответ: для запуска внешнего процесса будем использовать богатую на возможности функцию CreateProcess.
При успешном создании нового процесса эта функция заполняет передаваемую структуру PROCESS_INFORMATION, в частности поле hProcess, которое является указателем на новый процесс.
В случае надобности мы передаем полученный указатель на новый процесс в функцию WaitForSingleObject вместе со значением infinite.
В результате, WaitForSingleObject прервет выполнение потока нашей программы до тех пор, пока нужный нам процесс не завершится. В случае со значением infinite функция будет ждать бесконечно долго, поэтому вы должны быть уверены, что нужный процесс когда-нибудь завершится, иначе ваш поток никогда не получит управление обратно (в случае, если данный код исполняется для основного потока как в примере - это приведет к зависанию программы).

Пример:

//Функция для создания нового процесса
//Параметры:
// aCommand:  Строка для выполнения исполняемого файла(полный путь)
// aShow:     Показывать/не показывать окно нового процесса
// aWaitExit: Ожидать/не ожидать завершения процесса
function ExecCmd(const aCommand: String;const aShow, aWaitExit: Boolean): Boolean;
var
pi:PROCESS_INFORMATION;
si:STARTUPINFO;
cmdLine,Path: String;
begin
ZeroMemory(@si,sizeof(si));
si.cb:=SizeOf(si);
si.dwFlags := STARTF_FORCEONFEEDBACK+STARTF_USESHOWWINDOW;
if aShow then si.wShowWindow := SW_SHOWNORMAL else si.wShowWindow := SW_HIDE;
Path := ExtractFilePath(aCommand);
cmdLine := aCommand;

Result :=
       CreateProcess( nil,             // No module name (use command line).
                      PChar(cmdLine),  // Command line.
                      nil,             // Process handle not inheritable.
                      nil,             // Thread handle not inheritable.
                      False,           // Set handle inheritance to FALSE.
                      0,               // No creation flags.
                      nil,             // Use parent"s environment block.
                      PChar(Path),     // Use parent"s starting directory.
                      si,              // Pointer to STARTUPINFO structure.
                      pi );             // Pointer to PROCESS_INFORMATION structure.
if Result then
begin
  CloseHandle(pi.hThread);
  if aWaitExit then WaitForSingleObject( pi.hProcess, infinite );  
  CloseHandle(pi.hProcess);
end;
end;


Файл проекта с данным примером можно загрузить ЗДЕСЬ

Отвечали: Panov, Piter


 
wicked ©   (2005-10-18 21:17) [4]

хых.... передача вторым параметром в WaitForSingleObject более-менее разумного значения + цикл на 3 строки - и никаких зависаний...
пример на билдере (из одного из прожектов)
pi - PROCESS_INFORMATION
cancelled - член класса, отвечающий за то, нажал ли пользователь кнопку Cancel...

.bool do_wait = true;
.while(do_wait){
. int wait_result = WaitForSingleObject(pi.hProcess, 200);
. switch(wait_result){
.  case WAIT_OBJECT_0:
.  case WAIT_FAILED:
.   do_wait = false;
.   break;
. }
. Application->ProcessMessages();
. if(cancelled){
.  do_wait = false;
. }
.}

ЗЫ точки в начале строк убрать.... это "затычка" для местного скрипта, любящего убивать табы и пробелы в начале строки...



Страницы: 1 вся ветка

Текущий архив: 2005.11.06;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.044 c
6-1121752656
pupapum
2005-07-19 09:57
2005.11.06
Передача файлов по локальной сети


2-1129291926
Ним
2005-10-14 16:12
2005.11.06
TChart


6-1121975092
redlord
2005-07-21 23:44
2005.11.06
изменить время отведенное на коннект


4-1125491487
Black Krok
2005-08-31 16:31
2005.11.06
Исчерпание ресурсов Windows


2-1129123747
DelphiLexx
2005-10-12 17:29
2005.11.06
Проблемы с TChart