Delphi: как использовать индикатор выполнения для отображения хода выполнения CreateProcess?

У меня есть функция Startandwait, которая создает процесс и ждет его окончания. Как создать индикатор выполнения для отображения хода выполнения процесса?

function StartRAndWait (CommandLine : string) : Boolean;

var
  Proc_info: TProcessInformation;
  Startinfo: TStartupInfo;
  ExitCode: longword;
  CreateOK : Boolean;

begin

Result := False;

  FillChar(proc_info, sizeof (TProcessInformation), #0);
  FillChar(startinfo, sizeof (TStartupInfo), #0);
  Startinfo.cb := sizeof (TStartupInfo);
  Startinfo.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
  Startinfo.wShowWindow := SW_HIDE;

  CreateOK := CreateProcess(Nil, PChar('Program.exe ' + 'CMD  BATCH  ARQ.EXT  SampleOutput.txt'), nil,
  nil,False, CREATE_NEW_PROCESS_GROUP+NORMAL_PRIORITY_CLASS, nil,nil, StartInfo, proc_info);

  if (CreateOK) then
  begin
  WaitForSingleObject (proc_info.hProcess, INFINITE);
  GetExitCodeProcess(proc_info.hProcess, ExitCode);
  Result := True
  end;
  CloseHandle(proc_info.hThread);
  CloseHandle(proc_info.hProcess);

end;

person Artur_Indio    schedule 08.08.2014    source источник
comment
Какой именно прогресс вы хотите отобразить? Процесс не имеет собственного состояния выполнения. Если вы пытаетесь отобразить прогресс чего-то, что делает порожденный процесс, порожденный процесс должен будет передать эту информацию обратно вашему основному процессу через механизм IPC, такой как канал.   -  person Remy Lebeau    schedule 08.08.2014
comment
Бегущий индикатор выполнения — это то, что вам нужно, если вы не можете использовать ipc для получения значимых измерений прогресса.   -  person David Heffernan    schedule 08.08.2014
comment
Почему вы вызываете CloseHandle, когда CreateProces терпит неудачу?   -  person David Heffernan    schedule 08.08.2014
comment
@DavidHeffernan правда, я это исправлю.   -  person Artur_Indio    schedule 08.08.2014
comment
Я думаю, что я плохо выразился, я действительно хотел, чтобы индикатор выполнения заполнялся в соответствии со временем, которое идет процесс. Поэтому, когда он заканчивает, бар быстро заполняется. Ей не нужно точно показывать ход самого процесса, достаточно показать Пользователю, что что-то происходит, а не только указатель мыши.   -  person Artur_Indio    schedule 08.08.2014
comment
Используйте бегущую полосу прогресса   -  person David Heffernan    schedule 08.08.2014
comment
Это хорошая альтернатива.   -  person Artur_Indio    schedule 08.08.2014
comment
@ Артур, это не альтернатива. Если вы не можете предсказать, когда задание закончится, это ваш единственный хороший выбор.   -  person David Heffernan    schedule 08.08.2014
comment
и этот механизм IPC? Я думаю, что это более надежная альтернатива, но я еще изучу ее.   -  person Artur_Indio    schedule 08.08.2014
comment
Если вы контролируете оба процесса, вы можете использовать ipc для сообщения о ходе выполнения. Вы указали в комментариях, что не можете. Я подозреваю, что другим процессом является R. Какой прогресс вы можете ожидать от этого. Возможно, всасывание стандартного вывода в сочетании с бегущей строкой подойдет.   -  person David Heffernan    schedule 08.08.2014
comment
Теперь прояснил свои мысли, спасибо! Да, это R, конечно! Мои последние вопросы о R и Delphi! Марку попробую.   -  person Artur_Indio    schedule 08.08.2014


Ответы (2)


Судя по комментариям, вы ищете полосу прогресса. Установите для свойства Style индикатора выполнения значение pbstMarquee. Бегущая строка прогресса показывает прогресс, непрерывно перемещая индикатор вперед и назад.

Вам нужно будет накачать очередь сообщений, чтобы сохранить анимацию индикатора выполнения. Возможно, запустите код CreateProcess в отдельном потоке и сообщите основному потоку, когда это будет сделано. Или используйте ожидание на основе MsgWaitForMultipleObjects, которое позволяет вам ждать и обслуживать очередь.

person David Heffernan    schedule 08.08.2014
comment
Действительно CreateProcess блокирует анимацию прогрессбара, я не могу обойти это. - person Artur_Indio; 09.08.2014
comment
CreateProcess возвращается быстро. Вам нужно прокачать очередь. Ты? - person David Heffernan; 09.08.2014
comment
Хорошо, я не понимаю, что означает «прокачать очередь», но я поищу это. Спасибо. - person Artur_Indio; 11.08.2014

«Ход процесса» сам по себе не имеет внутреннего значения. Индикатор выполнения отображает именно то, что он запрограммирован отображать, что может иметь или не иметь ничего общего с реалистичным представлением прогресса всего, что происходит в программе. Итак, сначала вам нужно определить, что означает «прогресс процесса» в этом конкретном контексте. Но давайте предположим, что вы уже это сделали.

Второй шаг — заставить ваш процесс сообщать о своем прогрессе вызывающему процессу. У вас есть вторая программа? Можете ли вы заставить его писать на стандартный вывод (writeln)? Если это так, взгляните на второй пример, указанный в этом ответе, чтобы узнать, как создать процесс и заставить его читать вывод процесса. Затем вам просто нужно, чтобы дочерний процесс и родительский процесс понимали формат вывода, который он записывает, и соответственно обновляли индикатор выполнения каждый раз, когда дочерний процесс дает обновление.

Если нет, выводит ли дочерний процесс каким-то образом свой прогресс? Затем применяется тот же принцип, вам просто нужно принять формат, который он использует. Если нет, то вам не повезло, если вы не можете заставить автора добавить этот вывод в качестве функции.

person Mason Wheeler    schedule 08.08.2014
comment
Я отредактировал свой код. У меня есть результат, который я помещаю в текстовый файл. Пожалуйста, взгляните на мой комментарий выше. Но я думаю, кома ответа (пример), который вы процитировали, для решения моей проблемы. - person Artur_Indio; 08.08.2014