| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Сети > Как скачать файл из интернета без зависания? |
| Автор: diavo1os 5.8.2007, 12:38 | ||
Добрый день! подскажите пожалуйста...Как можно закачать файл из интернета без зависания...
Вот так я качаю файл..Но во время скачки у меня форма просто зависает а потом псоле закачки отвисает...и я ничего сделать не могу..возможно ли без зависания скачать ? Заранее спс... |
| Автор: Yanis 5.8.2007, 12:41 |
| diavo1os Слушай, ну на мастерах тебе же вроде подсказали. Или я ошибаюсь? Добавлено через 1 минуту и 40 секунд Дубль: http://www.delphimaster.ru/cgi-bin/forum.pl?id=1186218865&n=18 Добавлено через 5 минут и 25 секунд Наверняка повторюсь... Запусти функцию в отдельном потоке или используй последний параметр у URLDownloadToFile. Это тот, в котором ты передаёшь nil. |
| Автор: diavo1os 5.8.2007, 13:07 |
| я незнаю я там пять раз просил что в теме мне по теме отписывались..только вскольз.поэтмоу и обратился сюда..Пример покажи пожалуйста...я незнаю посл параметр у URLDownloadToFile и про поток я спрашивал кокретнее (Thread). и все молчат...а в интернете литературы на эту тему мало...можешь хоть продемонстрирвоать?: |
| Автор: ALeXandrK 5.8.2007, 13:27 | ||
| Про потоки же целая http://forum.vingrad.ru/topic-60076.html написана. Разбирайся ... не хочу Тебе же дали направление....
Разбираешь предложение по словам, выделяешь главные, а дальше ... поиск. Удачи |
| Автор: Alexeis 5.8.2007, 13:36 | ||
|
| Автор: Yanis 5.8.2007, 13:47 |
| Alexeis Блин, ну чё творишь, чё творишь? |
| Автор: Yanis 5.8.2007, 14:02 | ||
| Alexeis, ну не зря же я начал пальцы ломать на ноуте и писать экзампл. А ты меня опередил. Пришлось через лень дописывать Пример:
Для примера специально взял большой файл http://torrent.borland.com/turbodelphi_en.iso.zip. |
| Автор: diavo1os 5.8.2007, 14:16 |
| спс большое всем..осбенно Yanis...разобрался.... |
| Автор: MetalFan 5.8.2007, 15:54 |
| Yanis, а что от TObject, а не от TInterfacedObject, как Alexeis? ихо так нагляднее) нет лишнего кода |
| Автор: MikeLevinN 12.9.2007, 10:24 | ||
| Всем привет. Использовал один из выше приведеных способов в своем приложении, что бы скачать 20Кб. Но ситуация такая, что мне кажется, что где-то память не освобождается. А именно, до начала вызова этого кода, моя программа расходует около четырех Мб, после же, начинает расходовать около шести и даже более. Я было думал на свои кривые руки с разборкой скачанного файла, но попробовал просто вычеркнуть этап скачивания, подменив "скачанный" файл, файлом на диске, в таком случае с расходом памяти все нормально, т.е. это не в моем алгоритме косяк. Сам код этот:
Что тут не так, куда мне копать? |
| Автор: Alexeis 12.9.2007, 11:33 | ||
Это еще ни о чем не говорит. Утечки не проверяют по показаниям таск менеджера. Менеджер памяти делфи редко отдает память винде даже если удалены все объекты, потому что резервирует про запас. |
| Автор: MikeLevinN 12.9.2007, 11:51 |
| Хмм.. ну я даже не знаю, что и сказать, так просто кушать два метра памяти, на моём, хоть и мальеньком опыте не видел никогда. Просто не понимаю, как такое получается, что именно в данном случае влияет на это? Т.е. ведь если я создам обычный класс, он у меня отожрет памяти пусть тоже два метра, а потом его удалю, - то расход памяти, судя по task manager сокращается. А тут такое дело, может есть способы все же как-то воздействовать на это, дабы избежать этих лишних расходов? Просто успокоиться не могу ни как. Или не обращать на это внимание? И ещё вопрос в тему, как в данном коде прописать соединение через прокси? |
| Автор: Alexeis 12.9.2007, 12:27 |
| Нужно воспользоваться модулем для проверки утечек памяти. Что-то такое тут проскакивало на форуме, по завершению создается лог где написано чего и где не было освобождено. Без этого даже и браться не стоит. Кроме того приведенный пример почти пустой, ошибка может быть где угодно. Преведеные доводы не убедительны. Добавлено через 3 минуты и 8 секунд Модуль называется MemCheck.pas Он не стандартный но найти несложно. |
| Автор: MikeLevinN 12.9.2007, 16:17 | ||
| Да я проверяю на наличие утечек через FastMM4, но все нормально, никаких утечек не зафиксировано. Я ещё просто взял чистый новый проект, прикрутил код и запустил и опять подобная картина, расход памяти возрастает и ниже не становится. Я не понимаю в чем дело. Код в тестовом проекте такой же как и в примере, я добавил лишь:
Это нормальное явление, или как это объяснить? |
| Автор: Alexeis 12.9.2007, 16:40 |
| Я думаю дело в том что в память загружается еще дополнительно библиотека 'URLMON.DLL'. Вероятно она и занимает много оперативки. |
| Автор: MikeLevinN 12.9.2007, 17:23 |
| Ну об этом я в первую очередь и думал, но разве так должно быть? Почему она не выгружается, т.е. как её выгрузить? |
| Автор: Alexeis 12.9.2007, 17:31 |
Чтобы ее можно было выгрузить ее нужно динамически загрузить руками и получить адрес функции. Ну об этом же почти в любой книжке есть! |
| Автор: MikeLevinN 13.9.2007, 08:22 | ||
| Ничего не помогло. И не понимаю, что происходит. Избавился от UrlMon.pas сделал динамическую загрузку и выгрузку библиотеки. В ходе выяснилось, что сама загрузка библиотеки памяти много не отжирает, а вот в результате выполнения кода - закачки файла, наблюдается тоже самое память стремительно кушается. При выгрузке библиотеки, память не освобождается. Что не так?
|
| Автор: Alexeis 13.9.2007, 09:27 |
| MikeLevinN, это все же кэширование, причем возможно еще и кэширование винды. Если программу свернуть и развернуть, то первоначально память уменьшится до 600кб, а потом не будет превышать 2000 кб. таск мэнэнджер не показывает всей виртуальной памяти израсходованной программой, возможно такое увеличение связанно с подргрузкой из подкачки самой программы, ведь известно, что программа целиком в ОЗУ не загружается, только необходимый набор. |
| Автор: MetalFan 13.9.2007, 09:43 |
| а ничего, что часть методов CalBackInet ничего не позвращает? |
| Автор: Alexeis 13.9.2007, 10:37 |
| MetalFan, это же тестовый пример, а не реальный, да и не бывает так что ничего не возвращается совсем, просто значение результата неопределено. |
| Автор: Dragin 29.9.2007, 11:04 |
| TThread |
| Автор: Coderr 7.3.2008, 22:06 |
| Хм. Что-то не пойму... То ли инет у меня быстрый, то ли я что-то не понял. Использовал код Yanis'a из http://forum.vingrad.ru/index.php?showtopic=166532&view=findpost&p=1217255. Вроде даже ничего не менял... Получается так что при скачке файла размером 1,38 Мб label показывает 0, подвисает и через мгновение показывает что всё скачалось. И действительно, всё скачивается. Только процесс не отображается. Собсно, в этом и проблем. Прикладываю сорс. |
| Автор: Coderr 14.3.2008, 02:47 |
| Странно... теперь вобще не качает... :( |
| Автор: vovksextra 14.3.2008, 18:27 |
http://forum.vingrad.ru/forum/topic-196305.html |