背景説明:
少し前に、ビジネス ロジックでデータを .tar.gz 形式に圧縮する必要があると述べたデータ変換システムを開発しました。
Windows システムで使用します。まず、バッチ ファイルを生成し、WinExec を呼び出してバッチ ファイルを実行し、一定時間待機して、データの自動圧縮を完了します。
その後、圧縮するファイルのサイズが不確実で、WinExec 実行時に一定時間スリープするだけで圧縮に失敗し、ファイルが不完全または破損する可能性があることが判明しました。
最適化計画:
WinExe の代わりに、CreateProcess を使用してプロセスを開始し、バッチ ファイルを実行します。同時に、システムは TProcessInformation 構造体に自動的に入力します。
このとき、プログラムはバッチ内で自動的にブロックし、バッチ ハンドルのプロセスが終了するかタイムアウトになるのを待ちます。これにより、圧縮損傷の問題が解決されます。
デモの例を示します。
D7 コードは次のとおりです。
ユニット uMain; インターフェイスは Windows、メッセージ、SysUtils、バリアント、クラス、グラフィックス、コントロール、フォーム、ダイアログ、RzButton、StdCtrls を使用します。タイプ TFrmMain = class(TForm) mmMsg: TMemo; btnExecute: TRzBitBtn; btnClear: TRzBitBtn;文字列); btnExecuteClick(Sender: TObject); プロシージャ btnClearClick(Sender: TObject); private { プライベート宣言 } public { パブリック宣言 } end;var FrmMain: TFrmMain;implementation{$R *.dfm}プロシージャ TFrmMain.MsgDsp(v_Str: string); mmMsg.Lines.Add('[ admin ] - [' + v_Str + '] - [' + FormatDateTime('YYYY-MM-DD hh:mm:ss zzz', Now()) + ']');end;プロシージャ 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.dwFlags := STARTF_USESHOWWINDOW := SW_NORMAL; MsgDsp('パラメータの初期化が完了しました。WinExec デバッグを開始します'); //CreateProcess を使用してプロセスが開始され、TProcessInformation 構造体が埋められます。 //この時点で、プログラムはブロックされています。ハンドル、ハンドルのプロセスの終了を待つか、CreateProcess(nil, pchar(cmdLine), nil, nil, false, CREATE_NEW_CONSOLE または NORMAL_PRIORITY_CLASS, nil, でない場合はタイムアウト) nil, sInfo, pInfo) then begin MsgDsp('WinExec デバッグに失敗しました! '); MessageBox(Application.handle, '指定されたプログラムを開始できませんでした!'、'エラー'、MB_OK または MB_ICONSTOP); //指定されたハンドルのプロセスが終了するまで待つか、タイムアウトします。 WaitForSingleObject(pInfo.hProcess) , INFINITE); GetExitCodeProcess( pInfo.hProcess, exitCode); TFrmMain.btnClearClick(送信者: TObject);mmMsg.Clear の開始;end;end。
ランニング効果は以下の通りです。
要約する
上記は、外部プログラムの呼び出しと外部プログラムへのブロックについての編集者の紹介です。ご質問があれば、メッセージを残してください。編集者がすぐに返信します。また、Wulin.com ウェブサイトをサポートしてくださった皆様にも感謝いたします。
この記事が役立つと思われる場合は、転載していただいてかまいませんので、出典を明記してください。ありがとうございます。