Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 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
1-1160630818
alucard
2006-10-12 09:26
2006.11.26
Есть страничка, необходимо залогиниться.


3-1158663019
Mishenka
2006-09-19 14:50
2006.11.26
Как отобразить дерево в DbGridEh?


15-1162658830
ProgRAMmer Dimonych
2006-11-04 19:47
2006.11.26
Создатели веб-сайтов - хуже спамеров?


2-1162871719
Dimon20
2006-11-07 06:55
2006.11.26
Поиск по таблице


15-1162579351
Petr V. Abramov
2006-11-03 21:42
2006.11.26
Ваш профессиональный праздник?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский