Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проблемы с перенаправлением вывода из консоли

48K
04 мая 2009 года
dragon-by
1 / / 04.05.2009
Добрый день.

Возникла следующая проблема. Требуется запустить консольный менеджер закачек wget и выводить его работу на форму. Для перенаправления вывода из консоли использую пример hardcase conswrap скачанный с этого сайта. Работает отлично. Вот только так и не смог разобраться:

1. при передаче команды консоли - она ее исполняет. При передаче сразу 2 (3-х и т.д.) - они исполняются по очереди. Но вот если надо сделать так:
- передать 1-ю команду (закачка архива)
- передать 2-ю команду (тестирование архива)
- если архив скачан с ошибками - повторить загрузку
иначе команда на закачку следующего архива.
Так вот, при передаче первых двух команд (в одной процедуре) - архив качается и тестируется, но на это уходит слишком много времени, и если затем я пытаюсь найти в RichEdit упоминание об ошибке - его там еще нет. Получается такой механизм. Сначала передаются все сгенерированные команды, и лишь потом, когда процедура закончила работу, они выполняются в консоли.

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

Код:
//Загружает список файлов, а так же все необходимые файлы по этому списку
procedure TRobotForm.LoadFileFromWeb(System: string);
var
 Result: string;
 Source: string;
 Index: integer;
 i: integer;
 Options: string;
 UpFileOpen: boolean;
 WRAR: byte;
begin
 //Формируем список опций коммандной строки для WGET
 //Пробелы в конце командной строки необходимы для правильной склейки
 Options:='wget.exe ';
 //Добавим в командную строку логин и пароль для доступа к хосту
 if Data.HostAuthorization then
    Options:=Options+'--http-user='+Data.HostUserLogin+' --http-passwd='+Data.HostUserPassw+' ';
 //Стандартные параметры для загрузки списка файлов с сайта в корневую директорию робота
 Options:=Options+'--no-directories --tries=20 --continue=on --cache=off --server-response=on --dot-style=mega ';
 //--no-directories - в корень
 //--tries=20 - кол-во попыток для загрузки
 //--continue=on - Включить продолжение загрузки файла в случае обрыва соединения
 //--cache=off - Запрет кэширования на уровне сервера. Дата закачанного файла будет родной
 //--server-response=on - печатает на экране ответы сервера.
 //--dot-style=mega - вид индикатора загрузки
 //Если используется прокси сервер - добавляем в коммандную строку соответствующие параметры
 if Data.Proxy then
    begin
     Options:=Options+'--proxy=on --execute http_proxy='+Data.ProxyIPAddress+':'+Data.ProxyPort+' ';
     //Параметры авторизации прокси, если это необходимо
     if Data.ProxyAuthorization then
        Options:=Options+'--proxy-user='+Data.ProxyUserLogin+' --proxy-passwd='+Data.ProxyUserPassw+' ';
    end;
 //Формируем команду для загрузки списка файлов с сайта
 CurrientCommand.Text:=Options+Data.HostSite+'/update.php?type='+System;
 MemoScript.Text:=MemoScript.Text+'Загрузка списка файлов по команде:'+#13;
 MemoScript.Text:=MemoScript.Text+CurrientCommand.Text+#10#13;
 AppendLine(CurrientCommand.Text+#10#13);
 //Делаем проверку на наличие файла
 for i:=0 to 10 do          //Всего 10 попыток по 2 секунды - этого достаточно для загрузки файла объемом 3 кб и сохранения на любом компьютере
  begin
   AssignFile(UpFile,'update.php@type='+System);
   try
    Reset(UpFile);          //Открываем файл для обработки
    UpFileOpen:=true;
   except
    UpFileOpen:=false;
    Sleep(1000);            //Ждем 1 секунду
   end;
  end;
 //Если открыли файл, то начинаем с ним работать
 if UpFileOpen then
  while not EOF(UpFile) do
   begin
    readln(UpFile, Source);
    Index:=Find(Source,'>'+System);
    if Index<>0 then
     begin
      for i:=Index+1 to Length(Source) do
       begin
        if (Source='<')and(Source[i+1]='/')and(Source[i+2]='a')and(Source[i+3]='>') then Break;
        //Здесь храниться только имя файла для загрузки
        Result:=Result+Source;
       end;
      //Формируем команду для загрузки очередного файла
      Options:='wget.exe ';
      //Добавим в командную строку логин и пароль для доступа к хосту
      if Data.HostAuthorization then
         Options:=Options+'--http-user='+Data.HostUserLogin+' --http-passwd='+Data.HostUserPassw+' ';
      //Добавляем параметр, указывающий в какую папку загружать скачанные файлы
      Options:=Options+'--directory-prefix='+System+' ';
      //Стандартные параметры для загрузки списка файлов с сайта в корневую директорию робота
      Options:=Options+'--tries=20 --continue=on --cache=off --server-response=on --dot-style=mega ';
      //Если используется прокси сервер - добавляем в коммандную строку соответствующие параметры
      if Data.Proxy then
         begin
          Options:=Options+'--proxy=on --execute http_proxy='+Data.ProxyIPAddress+':'+Data.ProxyPort+' ';
          //Параметры авторизации прокси, если это необходимо
          if Data.ProxyAuthorization then
             Options:=Options+'--proxy-user='+Data.ProxyUserLogin+' --proxy-passwd='+Data.ProxyUserPassw+' ';
          //Отключаем модификацию файлов при загрузке через прокси.
          if Data.ProxyNoClobber then
             Options:=Options+'--no-clobber ';
         end;
      CurrientCommand.Text:=Options+Data.HostSite+'/updates/'+System+'/'+Result;
      MemoScript.Text:=MemoScript.Text+'Загрузка файла '+Result+#10#13;
      AppendLine(CurrientCommand.Text+#10#13);
      //Посылаем команду на тестирование архива. Если Архив поврежден - производим повторную загрузку
      AppendLine('wrar.exe t '+System+'\'+Result+#10#13);
      Result:='';
     end;
   end;
end;


2. При использовании вышеупомянутого conswrap'а кроме моего приложения появляется и экран консоли. Пытался ему явно указать - запускаться скрытым или хотя бы свернутым - не помогает. Как не показывать консоль?

Пытался указать тут - кусочек модуля Utils:

Код:
function StartChildProcess(const Exe, Cmd: string;

****поскипано******************************
 
      Sa.nLength:=sizeof(Sa);
      Sa.lpSecurityDescriptor:=nil;
      Sa.bInheritHandle:=true;
      ZeroMemory(@Si,sizeof(Si));
      Si.cb:=sizeof(Si);
      Si.dwFlags:=STARTF_USESTDHANDLES;
      Si.hStdInput:=StdInRead;
      Si.hStdOutput:=StdOutWrite;
      Si.hStdError:=StdOutWrite;

      [COLOR="Red"]Si.wShowWindow:=SW_HIDE;[/COLOR]

****поскипано**********************************


Вот такая беда. Может кто сможет помочь?

P.S. Сорри за много буков:)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог