2016-02-10 2 views
2

Я пишу код для восстановления резервных копий. Для этого я использую внешнюю программу. Пользователь может выбрать несколько файлов, и я буду выполнять внешнюю программу для каждого файла в цикле for. Как приостановить мою программу до выхода внешней программы перед восстановлением следующего файла?Пауза программы до выхода внешней программы

+1

Посмотрите на 'CreateProcess() и' WaitForSingleObject() '. 'CreateProcess()' возвращает дескриптор процесса, который вы можете подождать до тех пор, пока не будет завершен порожденный процесс. –

+1

Или просто попробуйте найти http://stackoverflow.com/questions/26181231/execute-and-wait-not-working-sometimes – smooty86

ответ

0

Вот пример с использованием CreateProcess() и WaitForSingleObject()

procedure RunaAndWait(Command:String); 
var 
    fStartupInfo: TStartupInfo; 
    fProcessInformation: TProcessInformation; 
    fProgram: String; 
begin 
    fProgram := trim(Command); 
    FillChar(fStartupInfo, SizeOf(fStartupInfo), 0); 
    with fStartupInfo do 
    begin 
    cb := SizeOf(TStartupInfo); 
    wShowWindow := SW_HIDE; 
    end; 

    if CreateProcess(nil, pchar(fProgram), nil, nil, true, CREATE_NO_WINDOW, 
    nil, nil, fStartupInfo, fProcessInformation) then 
    begin 
    while WaitForSingleObject(fProcessInformation.hProcess, 10) > 0 do 
    begin 
     Application.ProcessMessages; 
    end; 
    CloseHandle(fProcessInformation.hProcess); 
    CloseHandle(fProcessInformation.hThread); 
    end 
    else 
    begin 
    RaiseLastOSError; 
    end; 
end; 

Использование:

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    RunaAndWait('notepad.exe'); 
    Showmessage('Finished'); 
end; 
+1

вот пример ['WaitForSingleObject'] (https://msdn.microsoft. com/en-us/library/windows/desktop/ms687032 (v = vs.85) .aspx), что неверно: D – fantaghirocco

+0

ProcessMessages является проблематичным. Почему вы это называете? –