Считать данные из консоли запущенного приложения

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

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

Считать данные из консоли запущенного приложения

Сообщение DYUMON » 16.11.2020 11:42:31

Доброго всем времени суток.
Пытаюсь из своего приложения запустить другое консольное приложение и вывести на форме результаты.
Делаю так
Код: Выделить всё
procedure TPlayThread.Execute;

var
  MyProcess: TProcess;
  Buffer: array[0..127] of char;
  Readsize: integer;
  ReadCount: integer;
begin
  MyProcess := TProcess.Create(nil);
  //  try
  MyProcess.executable := 'D:\kod\consoletest\ptest.exe';
  Myprocess.parameters.add('1');
  Myprocess.parameters.add('2');
  Myprocess.parameters.add('31');
  Myprocess.parameters.add('Hell1');

  MyProcess.Options := MyProcess.Options + [poUsePipes];
  MyProcess.Execute;
  while MyProcess.Running do
  begin
    if MyProcess.Output.NumBytesAvailable > 0 then
    begin
      ReadSize := MyProcess.Output.NumBytesAvailable;
      if ReadSize > SizeOf(Buffer) then
        ReadSize := SizeOf(Buffer);
      ReadCount := MyProcess.Output.Read(Buffer, ReadSize);
      setstring(fStatusText, Buffer, ReadCount);
    end;
    Synchronize(@ShowStatus);
  end;
  // finally
  MyProcess.Free;
  // end;
end;                       

Но вывод в memo забивается одинаковыми строчками данных.
Подскажите как считывать данные по мере поступления.
Аватара пользователя
DYUMON
постоялец
 
Сообщения: 234
Зарегистрирован: 11.03.2009 13:32:54

Re: Считать данные из консоли запущенного приложения

Сообщение Alex2013 » 16.11.2020 14:30:30

Такой хак не подойдет ?

Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
begin
AllocConsole;
   try
    IsConsole := True;
    SysInitStdIO;
      Writeln(UTF8ToConsole('123 нажмите ентер'));
      Readln;
   finally
    FreeConsole;
   end;
end;
Последний раз редактировалось Alex2013 16.11.2020 14:52:56, всего редактировалось 2 раз(а).
Alex2013
долгожитель
 
Сообщения: 2923
Зарегистрирован: 03.04.2013 11:59:44

Re: Считать данные из консоли запущенного приложения

Сообщение DYUMON » 16.11.2020 14:45:58

Да нет там надо запустить консольное приложение и забрать вывод. Сейчас пробую компонент с палитры TAsyncProcess , вроде как нормально.
Аватара пользователя
DYUMON
постоялец
 
Сообщения: 234
Зарегистрирован: 11.03.2009 13:32:54

Re: Считать данные из консоли запущенного приложения

Сообщение Alex2013 » 16.11.2020 14:47:59

DYUMON писал(а):Да нет там надо запустить консольное приложение и забрать вывод. Сейчас пробую компонент с палитры TAsyncProcess , вроде как нормально.

Извини, вначале не вник в суть вопроса.

Как вариант ...
Код: Выделить всё
{$mode delphi}  {$H+}
uses
   Windows,ShellAPI....   

Const  h:hwnd =0;
       SearchHandle:hwnd =0;

function EnumProc(h:HWND; lParam:DWord):boolean; stdcall;
var
ProcessId, z:cardinal;
begin
Result:=True;
GetWindowThreadProcessId(h, ProcessId);
If ProcessId=lParam then
begin
SearchHandle:=h;
Result:=False;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
ExecInfo: TShellExecuteInfoA;
var
si:STARTUPINFO;
pi:PROCESS_INFORMATION;
buf:array[1..100] of char;

S:String;
P:Pointer;
begin
  ZeroMemory(@si, sizeof(si));
  si.cb:=SizeOf(si);
  P:=@EnumProc;
{  CreateProcess(nil, 'c:\windows\system32\cmd.exe', nil, nil, false,
  0, nil, nil, si, pi); }
  CreateProcess(nil, 'C:\Program Files\Far Manager\far.exe', nil, nil, false, 0, nil, nil, @si,@pi);
  SearchHandle:=0;
  sleep(150);
  While SearchHandle=0 do
  begin
  Windows.EnumWindows(@EnumProc,Lparam( pi.dwProcessId) );
  Application.ProcessMessages;
  end;
  H:=SearchHandle;
  if h<>0 then  begin
   windows.SetParent(h,form1.Handle);
   MoveWindow(h,0,0,Width,Height,true);
end;
end;


ИМХО Для наблюдения за консольным приложением (например за архиватором) самое то.
(Этот хак прячет окно консоли в внутрь GUI программы )
Alex2013
долгожитель
 
Сообщения: 2923
Зарегистрирован: 03.04.2013 11:59:44

Re: Считать данные из консоли запущенного приложения

Сообщение iskander » 16.11.2020 15:38:46

А по-простому
Код: Выделить всё
procedure TForm1.btRunClick(Sender: TObject);
var
  s: string;
begin
  if RunCommandIndir('D:\kod\consoletest', 'D:\kod\consoletest\ptest.exe',
                    ['1', '2', '31', 'Hell1'], s) then
    begin
      Memo1.Lines.BeginUpdate;
      try
        Memo1.Append(s);
      finally
        Memo1.Lines.EndUpdate;
      end;
    end;
end;

никак нельзя?
iskander
энтузиаст
 
Сообщения: 590
Зарегистрирован: 08.01.2012 18:43:34

Re: Считать данные из консоли запущенного приложения

Сообщение Alex2013 » 16.11.2020 15:57:24

iskander писал(а):А по-простому
...
никак нельзя?

А разве таким образом будет отслеживаться работа процесса ? :roll:
Alex2013
долгожитель
 
Сообщения: 2923
Зарегистрирован: 03.04.2013 11:59:44

Re: Считать данные из консоли запущенного приложения

Сообщение iskander » 16.11.2020 16:03:48

Alex2013 писал(а):А разве таким образом будет отслеживаться работа процесса ?

DYUMON писал(а):Доброго всем времени суток.
Пытаюсь из своего приложения запустить другое консольное приложение и вывести на форме результаты.

В какой части этого вопроса что-нибудь говорится об отслеживании?
iskander
энтузиаст
 
Сообщения: 590
Зарегистрирован: 08.01.2012 18:43:34

Re: Считать данные из консоли запущенного приложения

Сообщение DYUMON » 16.11.2020 16:13:38

Приложение консольное и выводит промежуточные данные работы, из и пытаюсь собирать.
Аватара пользователя
DYUMON
постоялец
 
Сообщения: 234
Зарегистрирован: 11.03.2009 13:32:54

Re: Считать данные из консоли запущенного приложения

Сообщение iskander » 16.11.2020 16:23:38

С TAsyncProcess что-нибудь получилось?
iskander
энтузиаст
 
Сообщения: 590
Зарегистрирован: 08.01.2012 18:43:34

Re: Считать данные из консоли запущенного приложения

Сообщение Alex2013 » 16.11.2020 16:26:48

iskander писал(а):В какой части этого вопроса что-нибудь говорится об отслеживании?

В этой ! :idea:
DYUMON писал(а):Подскажите как считывать данные по мере поступления.


Добавлено спустя 14 минут 43 секунды:
iskander писал(а):С TAsyncProcess что-нибудь получилось?


Действительно интересно !
Alex2013
долгожитель
 
Сообщения: 2923
Зарегистрирован: 03.04.2013 11:59:44

Re: Считать данные из консоли запущенного приложения

Сообщение iskander » 16.11.2020 16:42:28

Alex2013 писал(а):В этой !

Ага, уже увидел.
iskander
энтузиаст
 
Сообщения: 590
Зарегистрирован: 08.01.2012 18:43:34

Re: Считать данные из консоли запущенного приложения

Сообщение DYUMON » 16.11.2020 17:01:15

C TAsyncProcess тестовая консольку данные возвращает, но вот попытка запустить python.exe с передаваемым скриптом, рожает пустое консольное окно. И сказать запустился скрипт или нет, даже сказать не могу.

Добавлено спустя 1 минуту 9 секунд:
Ан нет , скприпт отрабатывает, но в memo пусто.
Аватара пользователя
DYUMON
постоялец
 
Сообщения: 234
Зарегистрирован: 11.03.2009 13:32:54

Re: Считать данные из консоли запущенного приложения

Сообщение Снег Север » 16.11.2020 17:36:54

Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2993
Зарегистрирован: 27.11.2007 16:14:47

Re: Считать данные из консоли запущенного приложения

Сообщение DYUMON » 16.11.2020 18:29:15

Да врожде делаю так
Код: Выделить всё
 
  Aprocess.Executable:='D:\kod\test\venv\Scripts\python.exe';
  AProcess.Parameters.Add('D:\kod\test\venv\test_parcer.py');
  AProcess.Parameters.Add('2020-11-14');
  AProcess.Options:=[poUsePipes];
  AProcess.Execute;

Появляется пустое консольное окно, если по диспетчеру задач судить ,скрпипт шуршит , в консоли тишина.
Аватара пользователя
DYUMON
постоялец
 
Сообщения: 234
Зарегистрирован: 11.03.2009 13:32:54

Re: Считать данные из консоли запущенного приложения

Сообщение Снег Север » 17.11.2020 08:46:14

DYUMON, не знаю, как там это реализовано. На делфи я делал по этой ссылке, работал с перекодировками с ffmpeg и с API одного почтового сервере с консольным клиентом. Всё работало.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2993
Зарегистрирован: 27.11.2007 16:14:47

След.

Вернуться в Lazarus

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

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

Рейтинг@Mail.ru