Nota de fundo:
Há algum tempo, desenvolvi um sistema de conversão de dados. A lógica de negócios afirmava que os dados precisavam ser compactados no formato .tar.gz.
Eu o uso no sistema Windows. Primeiro, gero um arquivo em lote, depois chamo o WinExec para executar o arquivo em lote, espero um período de tempo e concluo a compactação automática dos dados.
Posteriormente, descobriu-se que o tamanho do arquivo a ser compactado era incerto e simplesmente dormir por um tempo fixo durante a execução do WinExec pode causar falha na compactação, arquivos incompletos ou danificados.
Plano de otimização:
Em vez de WinExe, use CreateProcess para iniciar o processo e executar o arquivo em lote. Ao mesmo tempo, o sistema preencherá automaticamente a estrutura TProcessInformation.
Nesse momento, o programa bloqueará automaticamente o lote, aguardando o término do processo do identificador do lote ou o tempo limite. Isso resolverá o problema de dano por compressão.
Dê um exemplo de demonstração:
O código D7 é o seguinte:
unit uMain;faz interface com Windows, Mensagens, SysUtils, Variantes, Classes, Gráficos, Controles, Formulários, Diálogos, RzButton, StdCtrls;tipo TFrmMain = class(TForm) mmMsg: TMemo: TRzBitBtn; sequência); procedimento btnExecuteClick(Sender: TObject); procedimento btnClearClick(Sender: TObject); private { Declarações privadas } public { Declarações públicas } end;var FrmMain: TFrmMain;implementação{$R *.dfm}procedimento TFrmMain.MsgDsp(v_Str: string); começar 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; código de saída: Cardinal; MsgDsp('Parâmetros de inicialização'); cmdLine := 'C:/Arquivos de Programas/7-Zip/7zFM.exe'; sInfo.dwFlags:= STARTF_USESHOWWINDOW;sInfo.wShowWindow:= SW_NORMAL; MsgDsp('A inicialização do parâmetro foi concluída, inicie a depuração do WinExec'); //CreateProcess é usado para iniciar o processo, a estrutura TProcessInformation será preenchida. //Neste momento, o programa está bloqueado no. identificador, aguardando o final do processo do identificador ou tempo limite se não for CreateProcess(nil, pchar(cmdLine), nil, nil, false, CREATE_NEW_CONSOLE ou NORMAL_PRIORITY_CLASS, nil, nil, sInfo, pInfo) então comece MsgDsp('Falha na depuração do WinExec! '); MessageBox(Application.handle, 'O programa especificado falhou ao iniciar!', 'Erro', MB_OK ou MB_ICONSTOP end else start //Aguarde o término do processo do identificador especificado ou tempo limite WaitForSingleObject(pInfo.hProcess). , INFINITE); GetExitCodeProcess( pInfo.hProcess, exitCode('Depuração WinExec bem-sucedida!'); TFrmMain.btnClearClick(Remetente: TObject);begin mmMsg.Clear;fim;fim.
O efeito de execução é o seguinte:
Resumir
O texto acima é a introdução do editor ao Delphi chamando programas externos e bloqueando programas externos. Espero que seja útil para você. Se você tiver alguma dúvida, deixe-me uma mensagem e o editor responderá a tempo. Também gostaria de agradecer a todos pelo apoio ao site Wulin.com!
Se você acha que este artigo é útil para você, fique à vontade para reimprimi-lo, indique a fonte, obrigado!