•  

ГлавнаяIndyЧастые вопросы по Indy → IdFTP1.Get программа тихо умирает на полуслове

Создано: 17.05.2014 1:12:36 · Исправлено: 17.05.2014 1:12:36 · Прочтений: 1023

Делаю консольного FTP клиента для собственных надобностей под Д7 Indy 10. Все вроде работает, но :) В какой-то момент времени в нижепреведенной процедуре чтения после IdFTP1.Get программа тихо умирает на полуслове. Этот момент времени всегда разный. Коннект уже давно оторвался по таймауту, а в недрах приложения происходят какие-то тайные процессы :) Отладка ничего путевого не показывает - затык происходит где-то далеко в недрах инди. С таймаутами idFTP и idIOhandler (или как его там) игрался. Не помогает. Пытался с горя прикрутить BTimer, котрый разрывает соединение через 10 сек и сбрасывается в событии OnWork если процесс нормально идет - таймер при этом затыке не срабатывает. Я вполне допускаю, что это проблемы FTP сервера, но тот же самый код в GUI работает и приложение преспокойно разрывает соединение при подобных ситуациях. Хотелось бы чтобы и в консольном приложении все нормально отваливалось на любых затыках. В какой бубен еще ударить?
procedure TFTPSession.DownloadFTP(FileName,SaveName: string);
begin
  if not IdFTP1.Connected then exit;
  BytesToTransfer := IdFTP1.Size(FileName);
  try
    Write(  - +FileName+ +IntToStr(BytesToTransfer)+ Bytes. );
    BTimer.Enabled:=True;
    IdFTP1.Get(FileName, SaveName,true);
    //WriteLn( - Download complete.);

    if MoveMode then
    try
      begin
        IdFTP1.Delete(FileName);
        WriteLn(  - +FileName+  - Deleted.);
      end;
    except
      WriteLn(  - +FileName+  - Not Deleted!);
    end;
  except
    WriteLn( - Download filed!.);
    //if TransferrignData then IdFTP1.Abort;
    //idFTP1.Quit;
  end;
end;
Ищи чем консольное приложение отличается от оконного. Возможно indy использует очередь сообщений винды для обмена внутри себя... или еще что-то неявно из VCL. А зачем делать консольное приложение?
Можно в принципе и окно сделать, но это робот-ленивка и будет использоваться в скриптах и батниках. Логично чтобы приложение было консольным. Да и размер. И так уже 600к. Затык где-то на уровне idIOhandler.readln - readlwait Сессия уже накрылась, а процедура ждет бесконечно поступления непустой строки. Вызов идет не прямо, а через туеву хучу других индивских компонент типа WinSocs и т.д... Блин, видимо всех их придется копать до просветления :(
>>> Да и размер. И так уже 600к Делайте на WinAPI. Это очень просто. Поищите CreateWindow. Или CreateWindowEx. Это увеличит размер программы от силы на килобайт. Все остальное зависит от рук...