снова Tprocess, получение большого количества данных

Доброго времени суток!
Задача состоит в получении вывода 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 секунды:
только сейчас заметил, моя тема сотая!
С юбилеем, значитцца