Справочное примечание:
Некоторое время назад я разработал систему преобразования данных. В бизнес-логике говорилось, что данные необходимо сжимать в формат .tar.gz.
Я использую его в системе Windows. Сначала создайте пакетный файл, затем вызовите WinExec для его выполнения, подождите некоторое время и завершите автоматическое сжатие данных.
Позже было обнаружено, что размер сжимаемого файла неизвестен, и простой сон в течение фиксированного времени при выполнении WinExec может привести к сбою сжатия, неполным или поврежденным файлам.
План оптимизации:
Вместо WinExe используйте CreateProcess для запуска процесса и выполнения командного файла. При этом система автоматически заполнит структуру TProcessInformation.
В это время программа автоматически заблокирует пакет, ожидая завершения процесса обработки пакета или истечения времени ожидания. Это решит проблему повреждения при сжатии.
Приведите пример демо:
Код D7 выглядит следующим образом:
модуль uMain; использует интерфейсы Windows, сообщения, SysUtils, варианты, классы, графику, элементы управления, формы, диалоги, RzButton, StdCtrls; тип TFrmMain = class(TForm) mmMsg: TMemo; btnExecute: TRzBitBtn; строка); процедура btnExecuteClick(Sender: TObject); начать mmMsg.Lines.Add('[ admin ] - [' + v_Str + '] - [' + FormatDateTime('ГГГГ-ММ-ДД чч:мм:сс zzz', Now()) + ']');end;procedure TFrmMain.btnExecuteClick(Sender: TObject);var sInfo: TStartupInfo ; pInfo: TProcessInformation; cmdLine: строка; код выхода: Кардинал; начало MsgDsp('Параметры инициализации'); cmdLine := 'C:/Program Files/7-Zip/7zFM.exe'; FillChar(sInfo, sizeof(sInfo), #0); sInfo.cb := SizeOf(sInfo); sInfo.dwFlags:= STARTF_USESHOWWINDOW; sInfo.wShowWindow:= SW_NORMAL; MsgDsp('Инициализация параметров завершена, начните отладку WinExec'); //CreateProcess используется для запуска процесса. После запуска процесса структура TProcessInformation будет заполнена. //В это время программа заблокирована. дескриптор, ожидание окончания процесса дескриптора или таймаут, если не CreateProcess(nil, pchar(cmdLine), nil, nil, false, CREATE_NEW_CONSOLE или NORMAL_PRIORITY_CLASS, nil, nil, sInfo, pInfo), затем начать MsgDsp('Отладка WinExec не удалась! '); MessageBox(Application.handle, 'Не удалось запустить указанную программу!', 'Ошибка', MB_OK или MB_ICONSTOP); end else Begin //Дождитесь завершения процесса указанного дескриптора или истечения времени ожидания WaitForSingleObject(pInfo.hProcess). , INFINITE); GetExitCodeProcess( pInfo.hProcess, exitCode('Отладка WinExec успешна!'); TFrmMain.btnClearClick(Отправитель: TObject);begin mmMsg.Clear;end;end.
Эффект от бега следующий:
Подвести итог
Вышеизложенное представляет собой введение редактора в вызов внешних программ и блокировку внешних программ в Delphi. Я надеюсь, что это будет вам полезно. Если у вас есть какие-либо вопросы, оставьте мне сообщение, и редактор ответит вам вовремя. Я также хотел бы поблагодарить всех за поддержку сайта Wulin.com!
Если вы считаете, что эта статья вам полезна, вы можете ее перепечатать, укажите источник, спасибо!