Форум: "Основная";
Текущий архив: 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.058 c