Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.11.06;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.042 c
4-1126080735
Prov
2005-09-07 12:12
2005.11.06
Обработчик выбора пункта PopupMenu


2-1129221130
Fast2
2005-10-13 20:32
2005.11.06
Как во время выполнения программы прописать логин ..


3-1127737516
erika
2005-09-26 16:25
2005.11.06
запрос не понимает команды sql


14-1129373148
Иксик
2005-10-15 14:45
2005.11.06
Вот, блин, совпадения...


2-1129054161
quadronik
2005-10-11 22:09
2005.11.06
Корректировка данных





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский