Nota de fondo:
Hace algún tiempo, desarrollé un sistema de conversión de datos. La lógica empresarial decía que los datos debían comprimirse en formato .tar.gz.
Lo uso en el sistema Windows Primero, genero un archivo por lotes, luego llamo a WinExec para ejecutar el archivo por lotes, espero un período de tiempo y completo la compresión automática de datos.
Más tarde, se descubrió que el tamaño del archivo a comprimir era incierto y simplemente dormir durante un tiempo fijo al ejecutar WinExec puede causar fallas en la compresión, archivos incompletos o dañados.
Plan de optimización:
En lugar de WinExe, use CreateProcess para iniciar el proceso y ejecutar el archivo por lotes. Al mismo tiempo, el sistema completará automáticamente la estructura TProcessInformation.
En este momento, el programa se bloqueará automáticamente en el lote y esperará a que finalice o expire el proceso de manejo del lote. Esto resolverá el problema del daño por compresión.
Dé una demostración de ejemplo:
El código D7 es el siguiente:
unidad uMain; interfaz utiliza Windows, Mensajes, SysUtils, Variantes, Clases, Gráficos, Controles, Formularios, Diálogos, RzButton, StdCtrls; tipo TFrmMain = class(TForm) mmMsg: btnExecute: TRzBitBtn; btnClear: TRzBitBtn; cadena); procedimiento btnExecuteClick(Remitente: TObject); procedimiento btnClearClick(Remitente: TObject); privado {Declaraciones privadas} público {Declaraciones públicas} fin;var FrmMain: TFrmMain;implementación{$R *.dfm}procedimiento TFrmMain.MsgDsp(v_Str: string); comenzar mmMsg.Lines.Add('[ administrador ] - [' + v_Str + '] - [' + FormatDateTime('AAAA-MM-DD hh:mm:ss zzz', Now()) + ']');end;procedure TFrmMain.btnExecuteClick(Sender: TObject);var sInfo: TStartupInfo ; pInfo: TProcessInformation; cmdLine: cadena; código de salida: cardinal; comenzar MsgDsp('Parámetros de inicialización'); cmdLine := 'C:/Archivos de programa/7-Zip/7zFM.exe'; sInfo.dwFlags:= STARTF_USESHOWWINDOW; sInfo.wShowWindow:= SW_NORMAL; MsgDsp('Se completa la inicialización del parámetro, inicia la depuración de WinExec'); // CreateProcess se utiliza para iniciar el proceso, se completará la estructura TProcessInformation. // En este momento, el programa está bloqueado en manejar, esperando el final del proceso del identificador o tiempo de espera si no es CreateProcess(nil, pchar(cmdLine), nil, nil, false, CREATE_NEW_CONSOLE o NORMAL_PRIORITY_CLASS, nil, nil, sInfo, pInfo) luego comience MsgDsp('¡Error en la depuración de WinExec! '); MessageBox(Application.handle, '¡El programa especificado no pudo iniciarse!', 'Error', MB_OK o MB_ICONSTOP end else start //Espera a que finalice o expire el proceso del identificador especificado WaitForSingleObject(pInfo.hProcess); , INFINITO); GetExitCodeProcess( pInfo.hProcess, exitCode('¡Depuración de WinExec exitosa!'); TFrmMain.btnClearClick(Remitente: TObject);begin mmMsg.Clear;end;end.
El efecto de ejecución es el siguiente:
Resumir
Lo anterior es la introducción del editor a Delphi para llamar a programas externos y bloquearlos. Espero que le resulte útil. Si tiene alguna pregunta, déjeme un mensaje y el editor le responderá a tiempo. ¡También me gustaría agradecer a todos por su apoyo al sitio web Wulin.com!
Si cree que este artículo le resulta útil, puede reimprimirlo. Indique la fuente, ¡gracias!