Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.11.26;
Скачать: CL | DM;

Вниз

Проблема с Indy. Помогите найти ошибку.   Найти похожие ветки 

 
Tempora   (2006-06-13 13:13) [0]

Делаю программу для обновления данных на FTP. Использую Indy - IdFTPClient и IdAntifreeze. Все операции с ФТП выполняется в отдельном потоке. Пишу на Delphi из Borland Studio 2006. Версия Indy - 10, которая входит в дистрибутив.
Вот кусок кода (обновляет файл на ФТП):
[Code]try
if fworking.IdFTP1.Connected = false then
fworking.idftp1.Connect;
fworking.StatusBar1.Panels[0].Text:="Обновляю файл на FTP - "+filename+"...";
fworking.idftp1.Delete(filename);
fworking.idftp1.Put(sourcefilename,filename);
fWorking.log1.Items.Add(FormatDateTime("HH:nn:ss - ",now)+"Обновлен файл на FTP - "+filename;
except
fWorking.log1.Items.Add(FormatDateTime("HH:nn:ss - ",now)+"ОШИБКА при обновлении файла на FTP - "+filename;
end;
end;[/Code]
Для тестирования проги был поднят в локальной сети пробный FTP сервер. Все работало прекрасно. Программа была дописана и начала работать в боевых условиях.
И тут выяснилась очень большая проблема... Если соединение с FTP сервером медленное (выделенка со скоростью модема - 56Кбит) и файл довольно большой (от 15-20 Мб) то файл нормально закачивался и после этого программа замерзала, она не писала в log что Обновлен файл на FTP и ошибок тоже не писала - просто замерзала. Она не замерзала, просто тупо стояла и ждала пока её закроют.
Сегодня обновил Indy до последней версии скачанной с их сайта. Стало еще хуже, ничего не менял - просто перекомпилировал программу.
Если скорость соединения хорошая - все шикарно, хоть 4 Гб передавай - все цело. Если ограничить скорость до модемной - файл получается битый. Он закачивается на 99% где-то и пишет в логи что ОШИБКА при обновлении файла на ФТП.
Помогите, это глюк Indy? Или я не правильно с ним работаю?


 
Сергей М. ©   (2006-06-13 13:21) [1]

Антифриз тебе зачем ?
Этот код в доп.потоке выполняется ?


 
Tempora   (2006-06-13 13:26) [2]

Да, этот код выполняется отдельном потоке.
В принципе, при таком раскладе антифриз не нужен, думаете дело в этом?
Сейчас качал демку с сайта инди, поиставил её ограничение скорость в 56кбит и запустил закачивать тот же файл, посмотрим что будет где-то через час должен загрузить.


 
Сергей М. ©   (2006-06-13 13:28) [3]


> Да, этот код выполняется отдельном потоке


Обращение к VCL-контролам в доп.потоке недопустимо.


 
Tempora   (2006-06-13 13:29) [4]

>Обращение к VCL-контролам в доп.потоке недопустимо.
Извините, немного не понял эту фразу.
Нельзя работать с компонтетами формы из потока?


 
Tempora   (2006-06-13 14:15) [5]

Демо с сайта Indy тоже так себя ведет! Дело не в моем коде, а в ошибке в Indу.
Вот ошибка:
Project.exe raised exception class EidReplyRFCError with message Data connection closed, receive file Serup.exe aborted.
Как быть? Ведь далеко не я один с этим столкнулся, как я понимаю?


 
Tempora   (2006-06-13 15:32) [6]

В общем это только при закачке на ФТП (idftp.put)
При скачивании (idftp.get) никаких ошибок нет. Это явно недоработка Indy или возможно FTP-сервера (юзаю Serv-U). Вечером дома попробую поднять IIS 6 с FTP и с ним попробовать.


 
Сергей М. ©   (2006-06-13 15:34) [7]


> Нельзя работать с компонтетами формы из потока?


Нельзя.


> Демо с сайта Indy тоже так себя ведет


Неправда.


> Дело не в моем коде, а в ошибке в Indу


Тоже неправда.


 
Tempora   (2006-06-13 15:39) [8]

Сергей М

Можно по-понятней.
Я скачал демо с сайта инди, там нет потоков, откомпилировал его, начал через него заливать файл - таже ошибка.


 
Сергей М. ©   (2006-06-13 15:41) [9]


> скачал демо с сайта инди


Мне это ни о чем не говорит ..


 
Tempora   (2006-06-13 15:44) [10]

Сергей М.
http://www.indyproject.org/Sockets/Demos/index.en.aspx

IdFTP (FTP Client) 31 December 2004
http://www.indyproject.org/DemoDownloads/Indy_10_FTPClient.zip


 
Tempora   (2006-06-13 15:45) [11]

Просто откомпилируйте это демо без каких-либо изменений. Запустите, подключитесь по модему илил поставьте ограничение (шейп) на скорость соединения с ФТП какой-нибудь программой типа NetLimiter до 100 КБИТ или 16 КБАЙТ и попробуйте закачать на ФТП файл размером 35 Мб.


 
Сергей М. ©   (2006-06-13 15:54) [12]


> Tempora   (13.06.06 15:44) [10]


Оно мне надо, компилировать это ?

Если у тебя возникает искл-е класса EidReplyRFCError, перехватывай его и обрабатывай должным образом.

На то есть блок try..except.


 
assa   (2006-06-15 09:38) [13]

Целиком и полностью согласен с Tempora. Могу поделиться и своими наблюдениями. У меня aDSL modem-ное соединенение, скорость на отдачу 256, на прием - 512. FTP сервер из комплекта win 2003 (пробовал еще несколько других, в том числе и Server U). Не надо напрягаться и качать 35 мБ. Достаточно качнуть от 800 кБ до 1,2 мБ - повиснет Indy в 99 случаях из 100. И ни какой Antifreez ему не поможет. В результате длительных наблюдений заметил несколько особенностей:
1. Если клиент собран на процессоре Intel - то происходит меньше глюков чем на AMD (сам я предпочитаю AMD).
2. Не со всеми серверами FTP Indy себя так ведет. С некоторых качает в 99 случаях из 100.
3. Виснет Indy на попытке закрытия соединения с FTP сервером.
4. Скачаный файл не возможно открыть пока не закроешь Indy - клиента.


 
Eraser ©   (2006-06-15 14:15) [14]

> [13] assa   (15.06.06 09:38)


> 1. Если клиент собран на процессоре Intel - то происходит
> меньше глюков чем на AMD (сам я предпочитаю AMD).

мягко говоря, ерунда.

вообще просто, как говорится, надо уметь готовить. Или же вообще не использовать Indy для работы с FTP, что гораздо проще.


 
SpellCaster   (2006-07-03 10:13) [15]


> Сергей М. ©   (13.06.06 15:34) [7]
> > Нельзя работать с компонтетами формы из потока?
> Нельзя.

А нельзя ли пояснить? Когда создаешь новый тип потока, в автоматическом комментарии объясняется, что с компонентами формы надо работать только в процедурах, вызванных через Synchronize.
Вот какая схема у меня:

procedure TClientThread.WriteLog(s: string);
begin
fLogMsg:=s;
Synchronize(DoWriteLog);
end;

procedure TClientThread.DoWriteLog;
begin
Form1.Label2.Caption:=fLogMsg;
end;


Ведь так же можно, разве нет?


 
Dmitrij_K   (2006-07-03 10:29) [16]


> Ведь так же можно, разве нет?

НУЖНО. Так ты обращаешься в VCl не из доп потока, а из главного.


 
SpellCaster   (2006-07-04 11:23) [17]

Вот и славно. А то я уж начал опасаться, что нарушаю какую-нибудь Главную Заповедь Программирования Потоков :)



Страницы: 1 вся ветка

Текущий архив: 2006.11.26;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.052 c
15-1162893113
ProgRAMmer Dimonych
2006-11-07 12:51
2006.11.26
Дайте, плз, ссылки на сайты...


2-1163160333
Alex_C
2006-11-10 15:05
2006.11.26
Координаты мыши -> Memo X-Y


3-1158961120
_Ламер_
2006-09-23 01:38
2006.11.26
Избыточность


2-1162821990
daser
2006-11-06 17:06
2006.11.26
Как проверить такое, если форма свернута (на панель задач), то


6-1152182640
KLAUS
2006-07-06 14:44
2006.11.26
Ошибка в Webbrowser1