Форум: "Сети";
Текущий архив: 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