снова Tprocess, получение большого количества данных
 Добавлено: 28.09.2009 11:43:27
Добавлено: 28.09.2009 11:43:27Доброго времени суток!
Задача состоит в получении вывода tprocess, который в ходе отработки показывает процент исполнения работы, (ну например "freshclam")
внимательно читал вот это : http://wiki.lazarus.freepascal.org/Exec ... rograms/ru
однако в этом примере в ходе исполнения по экрану бежит только точка, а собственно разбор вывода происходит после.
на основе этого кода попытался получить желаемое, но вывод получается не полный (см рис1)
для сравнения выложил рисунок консоли(рис2), чего я собственно и хочу добиться
(sg_update - это stringgrid на который пишем вывод
Подскажите пожалуйста, где неправильно или хотя бы где искть?
Добавлено спустя 14 минут 44 секунды:
только сейчас заметил, моя тема сотая!
С юбилеем, значитцца
			Задача состоит в получении вывода tprocess, который в ходе отработки показывает процент исполнения работы, (ну например "freshclam")
внимательно читал вот это : http://wiki.lazarus.freepascal.org/Exec ... rograms/ru
однако в этом примере в ходе исполнения по экрану бежит только точка, а собственно разбор вывода происходит после.
на основе этого кода попытался получить желаемое, но вывод получается не полный (см рис1)
для сравнения выложил рисунок консоли(рис2), чего я собственно и хочу добиться
(sg_update - это stringgrid на который пишем вывод
- Код: Выделить всё
- const
 READ_BYTES = 2048;
 
 var
 s2: TStringList;
 M: TMemoryStream;
 P: TProcess;
 n: LongInt;
 BytesRead: LongInt;
 ss : string;
 begin
 ...
 P.CommandLine := 'freshclam';
 sg_update.appendrow('Выполняем :freshclam' ;
 P.Options := p.options + [poUsePipes];//, postderrtooutput];
 P.Execute;
 
 while P.Running do
 begin
 // Убедимся, что нам хватит места
 M.SetSize(BytesRead + READ_BYTES);
 
 // попытаемся прочитать данные
 n := P.Output.Read((M.Memory + BytesRead)^, READ_BYTES);
 if n > 0
 then begin
 Inc(BytesRead, n);
 s2.loadfromstream(p.output);
 if s2.count > 0 then
 begin
 ss := s2[0];
 delete(ss,1,keypos(' ',ss));
 if (curdownloadfile <> '')
 then
 begin
 if(curdownloadfile <> copy(ss,1,keypos(' ',ss)-1))
 then sg_update.appendrow(s2[0])
 else sg_update[0][sg_update.rowcount - 1] := s2[0];
 end
 else sg_update.appendrow(s2[0]);
 curdownloadfile := copy(ss,1,keypos(' ',ss)-1);
 application.processmessages;
 end;
 end
 else begin
 // нет данных, ждем 100 ms
 Sleep(100);
 end;
 end;
 
 // читаем последний блок
 repeat
 M.SetSize(BytesRead + READ_BYTES);
 n := P.Output.Read((M.Memory + BytesRead)^, READ_BYTES);
 if n > 0
 then begin
 s2.loadfromstream(p.output);
 if s2.count > 0 then sg_update.appendrow(s2[0]);
 end;
 until n <= 0;
 ss := 'Обновление завершено.';
 sg_update.appendrow(ss);
Подскажите пожалуйста, где неправильно или хотя бы где искть?
Добавлено спустя 14 минут 44 секунды:
только сейчас заметил, моя тема сотая!
С юбилеем, значитцца
 ))
))