Выдержка из лекций компьютерных курсов. Изучают DOS и Norton Commander. Дословно:
Запуск команды NORTON. Если запуск команды NORTON не включен в команду автозапуска, либо в процессе работы осуществлялся выход программы NORTON, то запустить ее можно с помощью посредства nc.exe - это запускающий файл программы NORTON, находится он в каталоге NC, где собрана вся программа.
Каким образом организовать ожидание завершения DOS-задачи? Например, надо подождать, пока заархивируется файл, и далее обработать его.
uses Windows;
procedure RunRarAndWait;
var
si: TStartupInfo;
pi: TProcessInformation;
begin//подготовливаем записи si и pi к использованию
FillChar(si, SizeOf(si));
si.cb := SizeOf(si);
FillChar(pi, SizeOf(pi));
//попытаемся запустить рарif CreateProcess('rar.exe', 'parameters',
nil, nil, //безопасность по умолчанию
false, //не наследовать хэндлов
0, //флаги создания по умолчаниюnil, //переменные среды по умолчаниюnil, //текущая директория по умолчанию
si, //стартовая информация
pi) //а в эту запись получим информацию о созданом процессеthenbegin//удалось запустить рар//подождем пока рар работает
WaitForSingleObject(pi.hProcess, INFINITE);
//убираем мусор
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
endelse//выдаем сообщение об ощибке
MessageDlg(SysErrorMessage(GetLastError), mtError, [mbOK], 0);
end;
Программный код, который вы предоставили, - это процедура Delphi, которая запускает архиватор RAR и ожидает его завершения. Вот подробное описание, как она работает:
Процедура RunRarAndWait инициализирует две переменные: si (StartupInfo) и pi (ProcessInformation). Эти структуры используются для хранения информации о процессе, который создается.
Процедура вызывает CreateProcess, чтобы запустить архиватор RAR с указанными параметрами. Если это успешно, она устанавливает обработчик процесса (pi.hProcess) с помощью WaitForSingleObject.
Код затем ожидает бесконечно завершения процесса RAR с помощью WaitForSingleObject. Это функция блокирует до тех пор, пока указанный объект не будет сигнализирован (то есть процесс RAR будет окончен).
Once the process has completed, the procedure closes the handles for the process and thread using CloseHandle.
Вот альтернативное решение, использующее более современный подход:
usesWindows,SyncObjs;procedureRunRarAndWait;varrarProcess:TProcess;beginrarProcess:=TProcess.Create(nil);tryrarProcess.Executable:='rar.exe';rarProcess.Parameters.Add('parameters');rarProcess.Run;whilerarProcess.RunningdoSleep(100);// wait for 0.1 secondsfinallyFreeAndNil(rarProcess);end;end;
В этом примере мы используем компонент TProcess из стандартной библиотеки Delphi, чтобы запустить архиватор RAR. Мы устанавливаем путь к исполняемому файлу и параметры, как и раньше, но вместо ожидания процесса с помощью WaitForSingleObject, мы используем цикл, который проверяет, является ли процесс еще работающим с помощью свойства Running. Если это так, мы спим на 0.1 секунды (100 миллисекунд) перед следующей проверкой. Это подход может быть более эффективен, чем блокировка до бесконечности.
Обратите внимание: в обоих примерах вы должны заменить 'parameters' на реальные параметры командной строки, которые требуются архиватором RAR.
Как организовать ожидание завершения DOS-задачи в программе на языке Delphi с использованием функции WaitForSingleObject.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.