Note de fond :
Il y a quelque temps, j'ai développé un système de conversion de données. La logique métier stipulait que les données devaient être compressées au format .tar.gz.
Je l'utilise sous le système Windows. Je génère d'abord un fichier batch, puis j'appelle WinExec pour exécuter le fichier batch, je mets en veille et j'attends un certain temps pour terminer la compression automatique des données.
Plus tard, il a été découvert que la taille du fichier à compresser était incertaine et que le simple fait de rester en veille pendant une durée déterminée lors de l'exécution de WinExec pouvait entraîner un échec de compression, des fichiers incomplets ou des dommages.
Plan d'optimisation :
Au lieu de WinExe, utilisez CreateProcess pour démarrer le processus et exécuter le fichier batch. En même temps, le système remplira automatiquement la structure TProcessInformation.
À ce moment-là, le programme se bloquera automatiquement dans le lot, en attendant la fin ou l'expiration du processus de gestion du lot. Cela résoudra le problème des dommages causés par la compression.
Donnez un exemple de démo :
Le code D7 est le suivant :
unité uMain;interfaceutilise Windows, Messages, SysUtils, Variantes, Classes, Graphiques, Contrôles, Formulaires, Boîtes de dialogue, RzButton, StdCtrls;type TFrmMain = class(TForm) mmMsg: TMemo; btnExecute: TRzBitBtn; chaîne); procédure btnExecuteClick(Expéditeur : TObject); procédure btnClearClick(Expéditeur : TObject); private { Déclarations privées } public { Déclarations publiques } end;var FrmMain: TFrmMain;implementation{$R *.dfm}procedure TFrmMain.MsgDsp(v_Str: string); commencer 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 : chaîne ; exitCode : Cardinal ; début MsgDsp('Paramètres d'initialisation'); cmdLine := 'C:/Program Files/7-Zip/7zFM.exe'; FillChar(sInfo, sizeof(sInfo), #0); sInfo.dwFlags := STARTF_USESHOWWINDOW; sInfo.wShowWindow := SW_NORMAL; MsgDsp('L'initialisation des paramètres est terminée, démarrez le débogage WinExec'); //CreateProcess est utilisé pour démarrer le processus, la structure TProcessInformation sera remplie. //À ce moment, le programme se bloque dans le handle. , en attendant la fin ou l'expiration du processus du handle sinon CreateProcess(nil, pchar(cmdLine), nil, nil, false, CREATE_NEW_CONSOLE ou NORMAL_PRIORITY_CLASS, nil, nil, sInfo, pInfo) puis commencez MsgDsp('Le débogage WinExec a échoué ! '); MessageBox(Application.handle, 'Le programme spécifié n'a pas pu démarrer !', 'Erreur', MB_OK ou MB_ICONSTOP); end else start //Attendez la fin du processus du handle spécifié ou expirez WaitForSingleObject(pInfo.hProcess , INFINITE); GetExitCodeProcess( pInfo.hProcess, exitCode); ('Débogage WinExec réussi !'); TFrmMain.btnClearClick (Expéditeur : TObject); début mmMsg.Clear; fin; fin.
L'effet de course est le suivant :
Résumer
Ce qui précède est l'introduction de l'éditeur à Delphi appelant des programmes externes et bloquant des programmes externes. J'espère que cela vous sera utile. Si vous avez des questions, veuillez me laisser un message et l'éditeur vous répondra à temps. Je voudrais également remercier tout le monde pour votre soutien au site Wulin.com !
Si vous pensez que cet article vous est utile, n'hésitez pas à le réimprimer, veuillez indiquer la source, merci !