[РЕШЕНО] TProcess + LazBuild

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

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

[РЕШЕНО] TProcess + LazBuild

Сообщение Brainenjii » 01.03.2012 13:19:51

Пытаюсь сделать автоматический сборщик проекта.
Пишу:
Код: Выделить всё
With TProcess.Create(nil) Do
    Begin
      Options := Options + [poUsePipes];
      CommandLine := '/path/to/lazbuild /path/to/target.lpr';
      Execute;
      Repeat
        Sleep(100);
        WriteLn(Running);
      Until FALSE;
      Free;
    End;   

и это дело зависает. Как мне узнать о выполнении и получить buffer вывода?

UPD: написал про буффер вывода, вспомнил, что есть ограничение для pipe, попробовал сложный вариант из вики - всё получилось.
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Re: [РЕШЕНО] TProcess + LazBuild

Сообщение alexey38 » 02.03.2012 07:48:53

Код: Выделить всё
      Repeat
        Sleep(100);
        WriteLn(Running);
      Until FALSE;


Вот это и зависает.
alexey38
долгожитель
 
Сообщения: 1627
Зарегистрирован: 27.04.2011 19:42:31

Re: [РЕШЕНО] TProcess + LazBuild

Сообщение Brainenjii » 02.03.2012 07:55:42

не, ну это понятно :-D Тут просто все время рисовало TRUE, и никогда FALSE
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Re: [РЕШЕНО] TProcess + LazBuild

Сообщение alexey38 » 02.03.2012 09:08:06

Я такой функционал реализую на WinAPI, там все просто. Компонентом я не пользуюсь, поэтому по нему не скажу.
На WinAPI.
CreateProcess возвращает заполненную структуру с типом _Process_Information.
В ней есть дескрипторы hProcess и hThread, дающие информацию о запущенном процессе.
Ждать окончание можно с помощью WaitForSingleObject(ResInf.hProcess,Infinite). Играясь с параметрами получаешь либо состояние либо ждешь завершения.
alexey38
долгожитель
 
Сообщения: 1627
Зарегистрирован: 27.04.2011 19:42:31

Re: [РЕШЕНО] TProcess + LazBuild

Сообщение Brainenjii » 02.03.2012 09:51:23

У меня получилось так:
Код: Выделить всё

Var
  aBuffer: TStringList;
  aSize: Integer = 0;
  aBufferSize: Integer = 0;
  aStream: TMemoryStream;
Begin
  bThreadSection.Enter;
  bStatus := rsWorking;
  bThreadSection.Leave;

  aBuffer := TStringList.Create;
  With TProcess.Create(nil) Do
    Begin
      Options := Options + [poUsePipes];
      CommandLine := 'lazbuild ' + bProject;
      Execute;
      aStream := TMemoryStream.Create;
      While (Running) Do
        Begin
          aStream.SetSize(aSize  + 2048);
          aBufferSize := Output.Read((aStream.Memory + aSize)^, 2048);
          If aBufferSize > 0 Then aSize += aBufferSize
          Else Sleep(100);
        End;
      Repeat
        aStream.SetSize(aSize + 2048);
        aBufferSize := Output.Read((aStream.Memory + aSize)^, 2048);
        If aBufferSize > 0 Then
          aSize += aBufferSize;
      Until Not(aBufferSize > 0);
      aStream.SetSize(aSize);

      aBuffer.LoadFromStream(aStream);
      aStream.Free;
      Free;
    End;

  If Pos('ERROR: ', aBuffer.Text) > 0 Then
    Begin
      bThreadSection.Enter;
      bStatus := rsFailed;
      bThreadSection.Leave;
    End
  Else
    With TProcess.Create(nil) Do
      Begin
        Options := Options + [poUsePipes];
        CommandLine := ExtractFileNameWithoutExt(bProject) + bTarget +
          ' --format=plain';
        Execute;
        WaitOnExit;
        aBuffer.LoadFromStream(Output);
        Free;
      End;
  bThreadSection.Enter;
  bStatus := rsFinished;
  bThreadSection.Leave;

  bOutput := aBuffer.Text;
  aBuffer.Free;
End;
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46


Вернуться в Lazarus

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

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

Рейтинг@Mail.ru