Форум: "Сети";
Текущий архив: 2006.11.26;
Скачать: [xml.tar.bz2];
ВнизПроблема с 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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.035 c