Главная страница
    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.46 MB
Время: 0.029 c
5-1108110079
Roughneck
2005-02-11 11:21
2005.11.06
Как добавить свойство в TColumn у DBGrid-а?


2-1129109894
MD2005
2005-10-12 13:38
2005.11.06
определение цвета в точках


1-1128931719
TButton
2005-10-10 12:08
2005.11.06
Drawing (вопрос общего характера)


8-1118551920
GekaNaz
2005-06-12 08:52
2005.11.06
отображение подгружаемых картинок


3-1127730434
_RusLAN
2005-09-26 14:27
2005.11.06
Как перенести даные из MS Access в базу Firebird





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский