Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2003.10.13;
Скачать: [xml.tar.bz2];

Вниз

многопотовый загрузчик файлов   Найти похожие ветки 

 
gedd   (2003-08-11 10:51) [0]

Кто нибудь знает как сделать многопотовый загрузчик файлов
компоненты idhttp idftp не подходят!


 
Reindeer Moss Eater   (2003-08-11 11:05) [1]

Чем же они не подходят?


 
Lahtak   (2003-08-11 12:18) [2]

лучше всего сделать через URLMON, у меня очень шустро работает,
или через WinInet


 
gedd   (2003-08-12 11:18) [3]

Поподробнее про URLMON пожалуйста!
лучше с кодом
через WinInet работает только коряво
например почему то в начальный момент
не определяет размер файла


 
Zelius   (2003-08-12 13:45) [4]


> Reindeer Moss Eater © (11.08.03 11:05) [1]

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


 
nikkie   (2003-08-12 14:09) [5]

>Zelius
ничего не понял... может ты тоже чего-то не умеешь?

>Lahtak
про urlmon я бы тоже послушал, только сдается мне, что это будет тот же WinInet. а недавно совсем обсуждали, что WinInet не позволяет использовать более 4 потоков.


 
Reindeer Moss Eater   (2003-08-12 14:13) [6]

> Reindeer Moss Eater © (11.08.03 11:05) [1]

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

Неужели? Вот не знал о таком несчастье. И как же я до сих пользовался этой библиотекой????


 
Zelius   (2003-08-12 17:42) [7]


> nikkie © (12.08.03 14:09) [5]

более того, чего-то я точно не умею :)
если ты знаешь, как двумя TidHTTP скачивать паралельно один файл, один с нуля до середины и второй с середины до конца, то поделись знанием!


 
Zelius   (2003-08-12 17:42) [8]


> Reindeer Moss Eater © (12.08.03 14:13) [6]

поедлись знанием, я так и не нашел ответа


 
nikkie   (2003-08-12 17:58) [9]

idhttp.request.from должен помочь. только у мя ощущение, у тя проблемы в другом, м что ты пытаешься паралельно в один файл с двух разных мест писать :))


 
Е-Моё имя   (2003-08-12 17:59) [10]

2 зелиус

посмотри лог регета, и будет тебе знание


 
Reindeer Moss Eater   (2003-08-12 18:17) [11]

Zelius © (12.08.03 17:42) [8]
> Reindeer Moss Eater © (12.08.03 14:13) [6]
поедлись знанием, я так и не нашел ответа


С тобой поделиться знанием как скачивать partial content, или как сохранять полученные байты в нужное место?

Или ты надеешся на существование магического метода у TidHTTP, "который_делает_как_тебе_надо"?


 
Zelius   (2003-08-12 20:23) [12]


> nikkie © (12.08.03 17:58) [9]

странные у тебя советы, интересно чем это мне мыло может помочь?


> Reindeer Moss Eater © (12.08.03 18:17) [11]

и то и то другое мне известно. Я говорю о том, что когда хочешь скачать кусок файла методом procedure TidHTTP.Get(AURL: string; const AResponseContent: TStream); overload;
то размер файла устанавливается в размер скачиваемого куска, что сильно мешает при многопотоковой скачки файла.


 
Palladin   (2003-08-12 20:48) [13]

тем же чем и мочалка...


 
Reindeer Moss Eater   (2003-08-13 09:25) [14]

> Reindeer Moss Eater © (12.08.03 18:17) [11]
Я говорю о том, что когда хочешь скачать кусок файла методом procedure TidHTTP.Get(AURL: string; const AResponseContent: TStream); overload;
то размер файла устанавливается в размер скачиваемого куска, что сильно мешает при многопотоковой скачки файла.


Да кто это тебе сказал? Школьный учитель пения что ли?


 
Reindeer Moss Eater   (2003-08-13 09:32) [15]

nikkie © (12.08.03 17:58) [9]
только у мя ощущение, у тя проблемы в другом, м что ты пытаешься паралельно в один файл с двух разных мест писать :))

Так он же надеется, что все экземпляры TidHTTP знают друг про друга все и работают слаженно без усилий сто стороны пользователя компонент.


 
Zelius   (2003-08-13 10:27) [16]


> Reindeer Moss Eater © (13.08.03 09:32) [15]

в отличии от тебя, похоже, я исходный код видел...


 
Reindeer Moss Eater   (2003-08-13 10:29) [17]

Zelius ©
в отличии от тебя, похоже, я исходный код видел...
Похвально.
Понял в нем что-нибудь?


 
Zelius   (2003-08-13 10:53) [18]


> Reindeer Moss Eater © (13.08.03 10:29) [17]

конечно, могу тебе объяснить ( хотя уже все и так объяснил, а ты не смог понять), а то ты бедняга смотришь в книгу и видишь фигу, только выеживаться и умеешь...


 
Reindeer Moss Eater   (2003-08-13 10:59) [19]

На, не плач. Может тоже что-нибудь увидишь.

var
Msg :string;
fStream :=TFileStream;
begin
Msg:="Я сильно заблуждался насчет библиотеки Indy"#13#10;
fStream:=TFileStream.Create("test.txt",fmOpenWrite);
fStream.WriteBuffer(Msg[1],Length(Msg));
IdHTTP1.Get(" http://www.delphimaster.ru/cgi-bin/forum.pl?n=4",fStream) ;
fStream.Free;
end;


 
Zelius   (2003-08-13 11:35) [20]


> Reindeer Moss Eater © (13.08.03 10:59) [19]

посмотри в конце размер файла и извинись...

procedure TForm1.Button1Click(Sender: TObject);
var
Msg: string;
fStream: TFileStream;
begin
Msg := "Я самый умный, потому что сам не пробовал, но думаю, что все должно работать так как Я хочу!"#13#10+
"Поэтому могу выпендриваться и раздовать дурацкие советы направо и налево, хотя сам никогда не пробовал так делать!"#13#10;

fStream := TFileStream.Create( "test.txt", fmCreate);
try
fStream.Size := 100000;
fStream.WriteBuffer( Msg[1], Length(Msg));
fStream.Position := 0;
IdHTTP1.Get( " http://www.delphimaster.ru/cgi-bin/forum.pl?n=4", fStream);
finally
fStream.Free;
end;
end;


 
Reindeer Moss Eater   (2003-08-13 11:41) [21]

посмотри в конце размер файла и извинись...

Посмотри на свой код, пойми что ты делаешь, и задумайся над своей способностью понимать советы старших.


 
Zelius   (2003-08-13 11:52) [22]


> Reindeer Moss Eater © (13.08.03 11:41) [21]

Я написал тот код, который мне нужен. Или ты считаешь, что многопоточная закачка файлов идет последовательно? Значит я не ошибся с написанным сообщением. Ладно, остынь, ты безнадежен, слушать старших, впавших досрочно в старческий маразм, не моё хобби.


 
Reindeer Moss Eater   (2003-08-13 11:54) [23]

Тебе был дан пример, показывающий, что
Get пишет в ResponseContent с текущей позиции в потоке назначения, ничего в нем не меняя.
Из этого еще не следует, что тебе советовали в разных потоках создавать FileStream на один и тот же файл.
Тебе давали понять, что запись в итоговый файл данных, полученных в разных нитках - это твоя забота, а не разработчиков компонент.
Собирай данные в памяти, и пиши поблочно в свой файл наздоровье, соблюдая нужные смещения.

Вот так-то, молодой человек без хобби.


 
Reindeer Moss Eater   (2003-08-13 12:00) [24]

тем, что инди не умеет писать в середину потока,

Так это Indy не умеет, или маленький ослик не умеет пользоваться Indy?


 
$hade   (2003-08-13 12:16) [25]

наверное все-таки 2е...
только все равно - злой ты какой-то...:-)


 
Reindeer Moss Eater   (2003-08-13 12:21) [26]

Я злой, но я вежливый по возможности.


 
Zelius   (2003-08-13 13:00) [27]


> Reindeer Moss Eater ©

Извини, ты злой и невежливый одновременно, плюс еще и невнимательный, поверь наслово...
А в середину потока как раз инди писать и не умеет, что я и доказал примером. Попробуй запусти, ты все поймешь... А для интереса, попробуй скачать не 10 Кб, а 10 Гб


 
Е-Моё имя   (2003-08-13 13:08) [28]

ну ты братец и тупица...

fStream.Position := 0;
не ты ли написал?


 
Reindeer Moss Eater   (2003-08-13 13:10) [29]

Внимательный и умный Zelius. Пойми одну простую истину.
Данные в твой файл пишет не Indy.
В твой файл данные пишет метод класса TFileStream.
Перед тобой виноваты разработчики класса TFileStream, а не разработчики Indy.

Попробуй запусти, ты все поймешь... А для интереса, попробуй скачать не 10 Кб, а 10 Гб

Я это делал, делаю, и еще долго буду делать и без твоих любезных предложений.


 
Zelius   (2003-08-13 13:14) [30]


> Е-Моё имя © (13.08.03 13:08) [28]

ну-ну, добро пожаловать в клуб не внимательных... тупиц ( хотя хотелось выразиться крепче), а то Reindeer Moss Eater там одному скушно наверное... если я так написал, значит мне это было нужно... представь себе, что второй кусок скачается первым, не знаю, способен ли ты на это...


 
Zelius   (2003-08-13 13:16) [31]


> Reindeer Moss Eater © (13.08.03 13:10) [29]

нет, ты все таки туповат от природы и ленив к тому же, если до сих пор не залез в исходники и не посмотрел как инди работает с потоком... У меня к тебе больше претензий нет, можешь не отвечать.


 
Reindeer Moss Eater   (2003-08-13 13:19) [32]

...если я так написал, значит мне это было нужно...

Долго смеялся.


 
Reindeer Moss Eater   (2003-08-13 13:22) [33]

Пишет так, как ему нужно, а работает так, как ему не нужно.
Любая шимпанзе в зоопарке уже давно бы догадалась попробовать сделать наоборот.


 
Zelius   (2003-08-13 13:26) [34]


> Reindeer Moss Eater © (13.08.03 13:22) [33]

это тебе соседи по клетке подсказали?
я давно обошел это ограничение.
Не смотря на нашу базарную ругань, факт остается фактом - инди не умеет писать в середину потока. Можешь брызгать... слюной сколько угодно, но ты это не изменишь. А началось все именно с этого утверждения...


 
Reindeer Moss Eater   (2003-08-13 13:28) [35]

инди не умеет писать в середину потока

Тебе русским языком сказали, что не Indy пишет туда.
Пишет метод класса конкретного потока, экземпляр которого передан методу Get.


 
Reindeer Moss Eater   (2003-08-13 13:29) [36]

Собирай данные в памяти, и пиши поблочно в свой файл наздоровье, соблюдая нужные смещения.

Вот это видел? Читал? Буквы понял?


 
nikkie   (2003-08-13 13:34) [37]

>Zelius
по поводу From вместо ContentRangeStart - виноват, ошибся. помнил, что это задается в Request, но быстрым взглядом промахнулся.

и все равно, проблемы твоей я не понимаю. речь идет о многопотоковой закачке? и ты хочешь, чтобы 2 потока (threads) писали в один поток (stream)?


 
Reindeer Moss Eater   (2003-08-13 13:35) [38]

"Ему так надо" :)


 
Zelius   (2003-08-13 15:52) [39]


> nikkie © (13.08.03 13:34) [37]

Да, скачиваю большой файл, открываю несколько файловых потоков на один файл и пишу прямо туда. С партиальной скачкой файлов у меня нет проблем, да у меня и вообще нету с этим проблем, все давно работает. Просто если бы Инди не выставляла размер потока как она это делает, то не пришлось бы рожать промежуточных буферов. Вот и все что я хотел сказать :)


 
Reindeer Moss Eater   (2003-08-13 15:54) [40]

Просто если бы Инди не выставляла размер потока как она это делает.

До парня никак не доходит, что это делает не Indy.


 
Zelius   (2003-08-13 16:01) [41]


> Reindeer Moss Eater

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

procedure TIdTCPConnection.ReadStream(AStream: TStream; AByteCount: Integer = -1;
const AReadUntilDisconnect: Boolean = False);
var
i: Integer;
LBuf: packed array of Byte;
LBufSize: Integer;
LWorkCount: Integer;

procedure AdjustStreamSize(AStream: TStream; const ASize: integer);
var
LStreamPos: LongInt;
begin
LStreamPos := AStream.Position;
AStream.Size := ASize; // Must reset to original size as in some cases size changes position
if AStream.Position <> LStreamPos then begin
AStream.Position := LStreamPos;
end;
end;

begin
if (AByteCount = -1) and (AReadUntilDisconnect = False) then begin
// Read size from connection
AByteCount := ReadInteger;
end;
// Presize stream if we know the size - this reduces memory/disk allocations to one time
if AByteCount > -1 then begin
AdjustStreamSize(AStream, AStream.Position + AByteCount); end;


Если бы не вызывался бы этот AdjustStreamSize, то можно было бы писать сразу в файл минуя горячо любимые тобой промежуточные буфера.


 
Reindeer Moss Eater   (2003-08-13 16:18) [42]

Ну и где здесь противоречие тому что я говорил?
Библиотека сама пишет данные в поток, переданный в качестве параметра?
Библиотека не может писать не с начала потока?
Библиотека не может закачивать параллельно в N потоков?


 
Zelius   (2003-08-13 16:22) [43]

проехали, забудь!


 
nikkie   (2003-08-13 17:03) [44]

>Zelius
забудь про инди. покажи мне код, который будет писать сразу в два места в файле, а то у меня фантазии не хватает. два потока (streams) на запись одного файла открыть нельзя. писать в один stream из двух разных threads - это как же изголиться надо... во-первых, постоянно синхронизироваться надо, во-вторых, в каждом thread надо запоминать position после записи кусочка и устанавливать position перед каждой записью.


 
Zelius   (2003-08-13 17:12) [45]


> nikkie © (13.08.03 17:03) [44]

ну не скажи, можно, у меня прекрасно работает.
ведь есть же такая вещь, как fmShareDenyRead и fmShareDenyWrite, открываешь дважды файл с соответсвующими флагами и все. дело в том, что каждый поток пишет в свою не пересекающуюся часть файла, поэтому никаких проблем не возникает, пиши себе в поток не задумываясь...


 
nikkie   (2003-08-13 18:00) [46]

ок, наконец понял, что ты пытаешься делать - создаешь TFileStream с флагом fmShareDenyNone в каждом потоке на один и тот же файл.

ну допустим создатели инди не предусмотрели именно такое использование и именно с TFileStream. допустим, так, как ты хочешь, не работает, потому что мешает AdjustStreamSize. а кто тебе мешает сделать свой TFileStream просто переопределив SetSize?


 
Zelius   (2003-08-13 18:27) [47]


> nikkie © (13.08.03 18:00) [46]

не повершь, это была моя первая мысль! я отключил изменение размера, но почему-то были неуловимые глюки, периодически файлы скачивались не правильно, пришлось отказаться от этой идеи.


 
nikkie   (2003-08-13 18:31) [48]

так может тогда проблема все ж таки не в инди? ;)


 
Zelius   (2003-08-13 18:36) [49]

нет, именно в инди, не надо брать на себя лишнее, типа, размер потока устанавливать. :)


 
gedd   (2003-08-14 10:01) [50]

Ребятки
Ваша перепалка конечно классная но хотелось бы работать не через
инди, а через общие протоколы типа WinInet овских

с компонентом инди IdHTTP были проблемы с кодировками
приведите пожалуйста пример
как можно скачать любой файл (*.http, *.rar и т.д.)

Вопрос с размером файла решил. Но ...
Как используя WinInet пройти через прокси сервер.


 
MACTEP   (2003-08-14 10:03) [51]

удалят жы твой пост, нисмышлёныш


 
gedd   (2003-08-14 10:04) [52]

а почему удалят то


 
MACTEP   (2003-08-14 10:09) [53]

будет написано "задай свой вопрос в новой ветке" гыгыгыгы)
может даже "гыгыгыгы" напишут
;))))


 
Zelius   (2003-08-14 10:12) [54]


> gedd

я только на инди качал, с WinInet ом так и не подружился, не разобрался с асинхронностью... зато все что угодно и пркокся не помеха


 
gedd   (2003-08-14 10:12) [55]

хорошо открываю новую ветку



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

Форум: "Сети";
Текущий архив: 2003.10.13;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.58 MB
Время: 0.008 c
1-40338
ABCMan
2003-09-30 22:12
2003.10.13
Даты


11-40324
access_violation
2003-01-09 19:28
2003.10.13
TPageControl, TStringGrid


1-40392
denis24
2003-10-01 09:47
2003.10.13
плавное исчезновение одной формы и появление другой


7-40704
qwerty2
2003-07-27 11:55
2003.10.13
Установить программно сетевой принтер


3-40317
Flash
2003-09-22 09:51
2003.10.13
Проблема с доступом к БД из разных потоков





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский