![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с Indy. Помогите найти ошибку. [WinXP]
Tempora © (2006-06-13 13:13:00)Делаю программу для обновления данных на 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? Или я не правильно с ним работаю?
SpellCaster (2006-07-04 11:23:00) [1]Вот и славно. А то я уж начал опасаться, что нарушаю какую-нибудь Главную Заповедь Программирования Потоков :)
Dmitrij_K (2006-07-03 10:29:00) [2]
> Ведь так же можно, разве нет?
НУЖНО. Так ты обращаешься в VCl не из доп потока, а из главного.
SpellCaster (2006-07-03 10:13:00) [3]
> Сергей М. © (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;
Ведь так же можно, разве нет?
Eraser (2006-06-15 14:15:00) [4]> [13] assa (15.06.06 09:38)
> 1. Если клиент собран на процессоре Intel - то происходит
> меньше глюков чем на AMD (сам я предпочитаю AMD).
мягко говоря, ерунда.
вообще просто, как говорится, надо уметь готовить. Или же вообще не использовать Indy для работы с FTP, что гораздо проще.
assa (2006-06-15 09:38:00) [5]Целиком и полностью согласен с 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 - клиента.
Сергей М. (2006-06-13 15:54:00) [6]
> Tempora (13.06.06 15:44) [10]
Оно мне надо, компилировать это ?
Если у тебя возникает искл-е класса EidReplyRFCError, перехватывай его и обрабатывай должным образом.
На то есть блок try..except.
Tempora (2006-06-13 15:45:00) [7]Просто откомпилируйте это демо без каких-либо изменений. Запустите, подключитесь по модему илил поставьте ограничение (шейп) на скорость соединения с ФТП какой-нибудь программой типа NetLimiter до 100 КБИТ или 16 КБАЙТ и попробуйте закачать на ФТП файл размером 35 Мб.
Tempora (2006-06-13 15:44:00) [8]Сергей М.
http://www.indyproject.org/Sockets/Demos/index.en.aspx
IdFTP (FTP Client) 31 December 2004
http://www.indyproject.org/DemoDownloads/Indy_10_FTPClient.zip
Сергей М. (2006-06-13 15:41:00) [9]
> скачал демо с сайта инди
Мне это ни о чем не говорит ..
Tempora (2006-06-13 15:39:00) [10]Сергей М
Можно по-понятней.
Я скачал демо с сайта инди, там нет потоков, откомпилировал его, начал через него заливать файл - таже ошибка.
Сергей М. (2006-06-13 15:34:00) [11]
> Нельзя работать с компонтетами формы из потока?
Нельзя.
> Демо с сайта Indy тоже так себя ведет
Неправда.
> Дело не в моем коде, а в ошибке в Indу
Тоже неправда.
Tempora (2006-06-13 15:32:00) [12]В общем это только при закачке на ФТП (idftp.put)
При скачивании (idftp.get) никаких ошибок нет. Это явно недоработка Indy или возможно FTP-сервера (юзаю Serv-U). Вечером дома попробую поднять IIS 6 с FTP и с ним попробовать.
Tempora (2006-06-13 14:15:00) [13]Демо с сайта Indy тоже так себя ведет! Дело не в моем коде, а в ошибке в Indу.
Вот ошибка:
Project.exe raised exception class EidReplyRFCError with message Data connection closed, receive file Serup.exe aborted.
Как быть? Ведь далеко не я один с этим столкнулся, как я понимаю?
Tempora (2006-06-13 13:29:00) [14]>Обращение к VCL-контролам в доп.потоке недопустимо.
Извините, немного не понял эту фразу.
Нельзя работать с компонтетами формы из потока?
Сергей М. (2006-06-13 13:28:00) [15]
> Да, этот код выполняется отдельном потоке
Обращение к VCL-контролам в доп.потоке недопустимо.
Tempora (2006-06-13 13:26:00) [16]Да, этот код выполняется отдельном потоке.
В принципе, при таком раскладе антифриз не нужен, думаете дело в этом?
Сейчас качал демку с сайта инди, поиставил её ограничение скорость в 56кбит и запустил закачивать тот же файл, посмотрим что будет где-то через час должен загрузить.
Сергей М. (2006-06-13 13:21:00) [17]Антифриз тебе зачем ?
Этот код в доп.потоке выполняется ?