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

Вопросы программирования и использования MSEide + MSEgui.

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

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

Сообщение minoshi » 28.09.2009 11:43:27

Доброго времени суток!

Задача состоит в получении вывода 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);


Подскажите пожалуйста, где неправильно или хотя бы где искть?

ris2.png
ris1.png
ris1.png (8.6 КБ) Просмотров: 8245


Добавлено спустя 14 минут 44 секунды:
только сейчас заметил, моя тема сотая!

С юбилеем, значитцца
Аватара пользователя
minoshi
постоялец
 
Сообщения: 279
Зарегистрирован: 17.05.2008 21:23:38

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

Сообщение debi12345 » 28.09.2009 17:07:27

С такими наворченными вопросами, пжалста, в ньюкоференцию "public.mseide-msegui.talk" на сервере "news://news.grid-sky.com" (можно настроить OutlookExpress на эту конфу). Перевод на английский - достаточно сервиса GIOOGLE.
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5752
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

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

Сообщение minoshi » 30.09.2009 11:20:21

Дэби!
ну какой аутлук? :)))
см. подпись
Аватара пользователя
minoshi
постоялец
 
Сообщения: 279
Зарегистрирован: 17.05.2008 21:23:38

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

Сообщение Attid » 30.09.2009 14:13:38

ну трантерберд я вот тут даже фоту настройки давал
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2585
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E


Вернуться в MSEide + MSEgui

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

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

Рейтинг@Mail.ru