TProcess, poUsePipes и Subversion (решено).

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

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

TProcess, poUsePipes и Subversion (решено).

Сообщение Sagrer » 21.09.2012 21:39:39

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

Пытаюсь добавить в свою консольную программку возможность вытягивать кой-какую инфу из рабочей копии с помощью вызова клиента subversion (всё под windows). Для пробы есть такой код:
Код: Выделить всё
  SvnProcess := TProcess.Create(nil);
  AStringList := TStringList.Create;
  SvnProcess.Executable := 'svn';
  SvnProcess.Options := [poUsePipes, poWaitOnExit];
  SvnProcess.Parameters.Add('help');
  SvnProcess.Execute;
  //AStringList.LoadFromStream(SvnProcess.Output);
  //Writeln(AStringList.Text);
  SvnProcess.Free;
  AStringList.Free;


Так вот, если в опции проставлена poUsePipes - всё зависает на SvnProcess.Execute; (дальше не исполняется, ждёт, т.е. будто бы висит сам svn). Если убрать poUsePipes - всё работает т.е. svn выводит свое сообщение посреди вывода моей программки в её консоль. Собсно, возможно ли чего-нибудь с этим сделать кроме как лезть в WinApi и TProcess-ом вообще не пользоваться? Ибо если я прально понял - единственный способ получить вывод процесса, запущенного TProcess-ом - включить пайпы и читать из них...
Последний раз редактировалось Sagrer 22.09.2012 14:00:56, всего редактировалось 1 раз.
Sagrer
незнакомец
 
Сообщения: 4
Зарегистрирован: 30.06.2008 18:00:51

Re: TProcess, poUsePipes и Subversion.

Сообщение Mr.Smart » 21.09.2012 23:06:29

Под винду я смог такое провернуть только с анонимными пайпами. Если честно, то с TProccess особо не разбирался. Не получилось сразу и я на него плюнул.
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: TProcess, poUsePipes и Subversion.

Сообщение Sagrer » 22.09.2012 14:00:45

в общем курил-курил это дело и докурился до такого:
Код: Выделить всё
  SvnProcess := TProcess.Create(nil);
  AStringList := TStringList.Create;
  TheStringList := TStringList.Create;
  TheStringList.Clear;
  SvnProcess.Executable := 'svn';
  SvnProcess.Options := [poUsePipes];
  SvnProcess.Parameters.Add('help');
  SvnProcess.CloseInput;
  SvnProcess.Execute;
  repeat
    Writeln('!');
    AStringList.LoadFromStream(SvnProcess.Output);
    TheStringList.AddStrings(AStringList);
  until SvnProcess.Running = false;
  Writeln(TheStringList.Text);
  SvnProcess.Free;
  AStringList.Free;


Т.е. svn похоже не хочет умирать до тех пор пока вызвавший процесс не прочитает всё что оно там написало в output, так и висит в процессах, как только LoadFromStream отрабатывает (можно проследить при отладке) - процесс svn сразу умирает, такие дела.
Sagrer
незнакомец
 
Сообщения: 4
Зарегистрирован: 30.06.2008 18:00:51


Вернуться в Lazarus

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

Сейчас этот форум просматривают: Yandex [Bot] и гости: 223

Рейтинг@Mail.ru