Запуск программы из delphi с ожиданием завершения ее работы

Запуск программы из delphi с ожиданием завершения ее работыРубрика: Новости -> Скрипты -> Delphi
Понедельник, 26 ноября 2012 г.
Просмотров: 10728
Настроение: хорошее:-)))
В колонках звучит: Crematory - Der Nachste
Подписаться на комментарии по RSS

В одной моей программе было необходимо запускать cmd скрипт и дожидаться завершения его выполнения.

В данной реализации написана процедура которая проверяет наличие заголовка программы в процессах.

Метод хорош, но если будет большой cmd скрипт который подразумевает длительное выполнение, то программа на delphi просто повиснет ожидая закрытия запущенного скрипта. Поэтому для того чтобы программа не зависала во время ожидания ответа от процедуры, ее следует запускать в дополнительном потоке и уже из потока отсылать данные о завершении работы cmd скрипта основному окну программы.

Для использования этой процедуры необходимо в USES подключить модуль ShellAPI.

uses
  ShellAPI
procedure ExecuteWait(const sProgramm: string; const sParams: string = ''; fHide: Boolean = false);
    var
      ShExecInfo: TShellExecuteInfo;
    begin
      FillChar(ShExecInfo, sizeof(ShExecInfo), 0);
      with ShExecInfo do
      begin
        cbSize := sizeof(ShExecInfo);
        fMask := SEE_MASK_NOCLOSEPROCESS;
        lpFile := PChar(sProgramm);
        lpParameters := PChar(sParams);
        lpVerb := 'open';
        if (not fHide) then
          nShow := SW_SHOW
        else
          nShow := SW_HIDE
      end;
      if (ShellExecuteEx(@ShExecInfo) and (ShExecInfo.hProcess <> 0)) then
        try
          WaitForSingleObject(ShExecInfo.hProcess, INFINITE)
        finally
          CloseHandle(ShExecInfo.hProcess);
        end;
end;

Метод вызова процедуры:

ExecuteWait('cmd', '/c get_info.bat', true);

Как писал выше для того чтобы программа не зависала, процедуру лучше запускать в отдельном потоке, а для того чтобы узнать о том что скрипт завершил свою работу, из потока нужно "куда то изъять данные" - для примера на главной форме(Form1) нужно разместить label(Label1), в него записать результат выполнения процедуры.

Для того чтобы ниже изложенный код работал, нужно в проекте создать поток(Thread) с именем new_process и подключить его к главной форме в uses - поток будет в каком то unit, а в каком виднее вам.

Метод создания потока

MyThread:=new_process.Create(False);

В потоке нужно разместить код самой процедуры ExecuteWait которая описана выше и прописать в uses главную форму(unit1):

implementation
uses
Unit1;
//......бла бла
//.....бла бла
procedure ExecuteWait
begin
///.....бла бла
end;
procedure new_process.Execute;
begin
   ExecuteWait('cmd', '/c get_info.bat', true);
   form1.Label1.Caption:='Выполнение скрипта cmd завершено';
end;

После завершения выполнения программы, вызванный поток пропишет в label1 главной формы: Выполнение скрипта cmd завершено.

twitter.com facebook.com vkontakte.ru odnoklassniki.ru mail.ru ya.ru rutvit.ru myspace.com technorati.com digg.com friendfeed.com pikabu.ru blogger.com liveinternet.ru livejournal.ru memori.ru google.com bobrdobr.ru mister-wong.ru yahoo.com yandex.ru del.icio.us

Оставьте комментарий!

grin LOL cheese smile wink smirk rolleyes confused surprised big surprise tongue laugh tongue rolleye tongue wink raspberry blank stare long face ohh grrr gulp oh oh downer red face sick shut eye hmmm mad angry zipper kiss shock cool smile cool smirk cool grin cool hmm cool mad cool cheese vampire snake excaim question

Используйте нормальные имена. Ваш комментарий будет опубликован после проверки.

(войти без комментирования)

Имя и сайт используются только при регистрации

Если указать email (зарегистрироваться), то будет уведомление о новых комментариях.

Выберите человечка с поднятой рукой!