Hintergrundinformation:
Vor einiger Zeit habe ich ein Datenkonvertierungssystem entwickelt. Die Geschäftslogik besagte, dass die Daten in das .tar.gz-Format komprimiert werden mussten.
Ich verwende es unter dem Windows-System. Zuerst erstelle ich eine Batchdatei, rufe dann WinExec auf, um die Batchdatei auszuführen, warte eine Weile und schließe die automatische Komprimierung der Daten ab.
Später stellte sich heraus, dass die Größe der zu komprimierenden Datei ungewiss war und das bloße Inaktivieren für eine bestimmte Zeit während der Ausführung von WinExec zu Komprimierungsfehlern sowie zu unvollständigen oder beschädigten Dateien führen konnte.
Optimierungsplan:
Verwenden Sie anstelle von WinExe CreateProcess, um den Prozess zu starten und die Batchdatei auszuführen. Gleichzeitig füllt das System automatisch die TProcessInformation-Struktur aus.
Zu diesem Zeitpunkt blockiert das Programm automatisch den Batch und wartet darauf, dass der Prozess des Batch-Handles beendet wird oder eine Zeitüberschreitung auftritt. Dadurch wird das Problem der Komprimierungsschäden behoben.
Geben Sie eine Beispieldemo:
Der D7-Code lautet wie folgt:
unit uMain;interfaceuses Windows, Messages, Graphics, Controls, Forms, RzButton, StdCtrls;type TFrmMain = class(TForm) mmMsg: TMemo; btnExecute: TRzBitBtn; procedure MsgDsp(v_Str: string); Prozedur btnExecuteClick(Sender: TObject); procedure btnClearClick(Sender: TObject); private { Private Deklarationen } public { Öffentliche Deklarationen } end;var FrmMain: TFrmMain;implementation{$R *.dfm}procedure TFrmMain.MsgDsp(v_Str: string); begin mmMsg.Lines.Add('[ admin ] - [' + v_Str + '] - [' + FormatDateTime('YYYY-MM-DD hh:mm:ss zzz', Now()) + ']');end;procedure TFrmMain.btnExecuteClick(Sender: TObject);var sInfo: TStartupInfo ; pInfo: TProcessInformation; cmdLine: string;exitCode: Cardinal;begin MsgDsp('Initialisierungsparameter'); cmdLine := 'C:/Program Files/7-Zip/7zFM.exe'; FillChar(sInfo, sizeof(sInfo), #0); sInfo.dwFlags := STARTF_USESHOWWINDOW; sInfo.wShowWindow := SW_NORMAL; MsgDsp('Parameterinitialisierung ist abgeschlossen, WinExec-Debugging starten'); //CreateProcess wird zum Starten des Prozesses verwendet. Nach dem Start des Prozesses wird die TProcessInformation-Struktur ausgefüllt. //Zu diesem Zeitpunkt ist das Programm blockiert Handle, wartet auf das Ende des Prozesses des Handles oder auf Timeout, wenn nicht. CreateProcess(nil, pchar(cmdLine), nil, nil, false, CREATE_NEW_CONSOLE oder NORMAL_PRIORITY_CLASS, nil, nil, sInfo, pInfo) dann beginnen MsgDsp('WinExec-Debugging fehlgeschlagen! '); MessageBox(Application.handle, 'Das angegebene Programm konnte nicht gestartet werden!', 'Error', MB_OK oder MB_ICONSTOP); , INFINITE); GetExitCodeProcess( pInfo.hProcess, exitCode); MsgDsp('WinExec-Debugging erfolgreich!'); TFrmMain.btnClearClick(Sender: TObject);begin mmMsg.Clear;end;end.
Der Laufeffekt ist wie folgt:
Zusammenfassen
Das Obige ist die Einführung des Herausgebers zum Aufrufen externer Programme und zum Blockieren externer Programme. Wenn Sie Fragen haben, hinterlassen Sie mir bitte eine Nachricht und der Herausgeber wird Ihnen rechtzeitig antworten. Ich möchte mich auch bei allen für Ihre Unterstützung der Website Wulin.com bedanken!
Wenn Sie der Meinung sind, dass dieser Artikel für Sie hilfreich ist, können Sie ihn gerne erneut drucken. Bitte geben Sie die Quelle an. Vielen Dank!