Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.10.13;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.61 MB
Время: 0.038 c
1-40456
ProLam
2003-10-02 17:11
2003.10.13
Цвет отдельного пикселя


4-40746
arous
2003-08-05 00:12
2003.10.13
Сеансы WinXP


4-40722
k@rt
2003-08-08 20:33
2003.10.13
EDIT во все окно


1-40400
Soi
2003-10-01 06:08
2003.10.13
Сортировка массивов


14-40606
Тих
2003-09-10 20:59
2003.10.13
Мастера, есть статья.