TProcess - ожидание завершения запущенногоприложения.

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

TProcess - ожидание завершения запущенногоприложения.

Сообщение arriah » 29.07.2015 17:31:34

Здравствуйте,

Нужна помощь. Поиском пользовался на форуме, но ответа не нашел.
Суть такая:

имеется некая программа (softina.exe), которая выполняет определенные действия и лог этих действий пишет в файлик. Для запуска программа использует конфигурационный файл.

При помощи TProcess сделал следующее:
Код: Выделить всё
          Process1.Executable:='softina.exe';
          Process1.Execute;
          Process1.WaitOnExit; //ожидаем завершения
          Memo2.Lines.Add(grName+' - Выполнено');


Вроде нормально работает, за исключением того что моя программа "неактивна", так как ожидает завершение запущенной программы.
Мне надо сделать так чтобы программа была отзывчива к пользователю, но при этом продолжала ждать завершения.
Запущеная софтина пишет лог в файл, и в моей программе надо в реальном времени отслеживать эти логи - но из ожидания - она этого не может.

Есть ли какой-то вариант поправить это дело?

Спасибо.
arriah
новенький
 
Сообщения: 94
Зарегистрирован: 29.07.2015 16:42:35

Re: TProcess - ожидание завершения запущенногоприложения.

Сообщение yus » 29.07.2015 17:40:21

Запускать в отдельном потоке и при возникновении от потока события OnTerminate, делать, что планировалось.

Вот статья в Вики про TProcess.
http://wiki.freepascal.org/Executing_External_Programs/ru
yus
новенький
 
Сообщения: 27
Зарегистрирован: 29.03.2015 14:29:29
Откуда: Москва

Re: TProcess - ожидание завершения запущенногоприложения.

Сообщение arriah » 29.07.2015 18:30:01

Спасибо, это я читал. Но как запустить в отдельном потоке. так и не понял. Может подскажете?
arriah
новенький
 
Сообщения: 94
Зарегистрирован: 29.07.2015 16:42:35

Re: TProcess - ожидание завершения запущенногоприложения.

Сообщение yus » 29.07.2015 19:19:34

Упрощенно так.
Описываем поток который будет запускать программу.
Код: Выделить всё
....
{ TMyThread }

  TMyThread = class(TThread)
  public
    procedure Execute; override;
  end;   
....
procedure TMyThread.Execute;
var
  pr: TProcess;
begin
  pr := TProcess.Create(nil);
  try
    pr.CommandLine := 'calc.exe';
    pr.Execute;
    pr.WaitOnExit;
  finally
    FreeAndNil(pr);
  end;
end;


Потом описываем метод OnTerminate, котрый вызовется при завершении потока.
Код: Выделить всё
procedure TForm1._OnTerminate(Sender: TObject);
begin
  Memo1.Lines.Add('end');
  FreeAndNil(Fmypr);
end;       



создаем поток и стартуем его.
Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
begin
  Fmypr := TMyThread.Create(True);
  Fmypr.OnTerminate := @_OnTerminate;
  Fmypr.start;
end;               


Приложение продолжает работать как прежде, ни чего не зависает.

Еще раз повторюсь, это самый упрощенный вариант.
yus
новенький
 
Сообщения: 27
Зарегистрирован: 29.03.2015 14:29:29
Откуда: Москва

Re: TProcess - ожидание завершения запущенногоприложения.

Сообщение arriah » 29.07.2015 19:20:51

ага, спасибо. попробую разобраться - потоки для меня новое :)

Добавлено спустя 1 час 38 минут 38 секунд:
Что-то у меня не срослось даже на самом простом примере, при компиляции:
Код: Выделить всё
there is no method in an ancestor class to be overridden "TMyThread.Execute;"
arriah
новенький
 
Сообщения: 94
Зарегистрирован: 29.07.2015 16:42:35

Re: TProcess - ожидание завершения запущенногоприложения.

Сообщение slyubez » 29.07.2015 21:07:01

arriah писал(а):ага, спасибо. попробую разобраться - потоки для меня новое :)

Вначале надо понять вот такую вещь:
http://www.sql.ru/forum/actualfile.aspx?id=17919774
slyubez
постоялец
 
Сообщения: 180
Зарегистрирован: 31.03.2015 08:44:07

Re: TProcess - ожидание завершения запущенногоприложения.

Сообщение arriah » 29.07.2015 22:04:15

Для понимания порисходящего сделал вот что:

Код: Выделить всё
  TestThread = class {TThread}
    private
      results:integer;
    protected
      procedure ShowResult;
      procedure Execute; override;
    public
      Constructor Create (CreateSuspended: boolean);
  end;
...
   constructor TestThread.Create(CreateSuspended:boolean);
begin
  FreeOnTerminate:=True;
  inherited Create(CreateSuspeded);
end;

Procedure TestThread.ShowResult;
begin
  Form1.Edit1.Text:=InToStr(results);
end;

Procedure TestThread.Execute;
var
  i:integer;
  begin
    results:=0;
    for i:=0 to 65000 do
        begin
          results:=results+1;
          Synchronize (@ShowResault);
        end;
  end;


Бросил на форму кнопку и edit, в обработчике кнопки прописал:
Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
var
  StartThread:TestThread;
begin
  StartThread:=TestThread.Create(true);
  StartThread.Resume;
end;


При компиляции снова ошибка:
Код: Выделить всё
there is no method in an ancestor class to be overridden "TestThread.Execute;"


И доку почитал на вики...
Мозг? руки?
arriah
новенький
 
Сообщения: 94
Зарегистрирован: 29.07.2015 16:42:35

Re: TProcess - ожидание завершения запущенногоприложения.

Сообщение yus » 30.07.2015 07:49:55

Для понимания механизма работы с потоками, есть замечательная статья.
Читать и перечитывать, читать и перечитывать до просветления :)
http://forum.vingrad.ru/topic-60076.html
yus
новенький
 
Сообщения: 27
Зарегистрирован: 29.03.2015 14:29:29
Откуда: Москва

Re: TProcess - ожидание завершения запущенногоприложения.

Сообщение Vadim » 30.07.2015 13:06:32

Если речь идёт только о Windows, то вторую программу можно запускать с помощью Shellexecute(). Эта winapi функция выпнет её в отдельный процесс, не задерживая основную программу.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: TProcess - ожидание завершения запущенногоприложения.

Сообщение alexs » 30.07.2015 14:48:43

Попробуйте TAsyncProcess
Он именно для асинхронного запуска предназначен.
Там есть события на чтение вывода от запущенного процесса.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4064
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: TProcess - ожидание завершения запущенногоприложения.

Сообщение arriah » 01.08.2015 21:52:22

Vadim писал(а):Если речь идёт только о Windows, то вторую программу можно запускать с помощью Shellexecute(). Эта winapi функция выпнет её в отдельный процесс, не задерживая основную программу.

Да,речь идет только о Windows, но весь вопрос в том, что мне надо отследить завершение вызыванной софтины.
arriah
новенький
 
Сообщения: 94
Зарегистрирован: 29.07.2015 16:42:35

Re: TProcess - ожидание завершения запущенногоприложения.

Сообщение PapaNT » 02.08.2015 11:26:20

В видне и никсах есть номер процесса. Можно, к примеру, раз в секунду проверять завершение порожденного процесса. Еще можно попробовать поиграться с семафорами в ОС.
PapaNT
постоялец
 
Сообщения: 167
Зарегистрирован: 11.09.2009 12:06:46
Откуда: Москва

Re: TProcess - ожидание завершения запущенногоприложения.

Сообщение arriah » 02.08.2015 12:07:52

PapaNT писал(а):В видне и никсах есть номер процесса. Можно, к примеру, раз в секунду проверять завершение порожденного процесса. Еще можно попробовать поиграться с семафорами в ОС.

Можно, но через потоки оказалось удобнее и проще :)
arriah
новенький
 
Сообщения: 94
Зарегистрирован: 29.07.2015 16:42:35


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 221

Рейтинг@Mail.ru