![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
многопотовый загрузчик файлов [D7, Win2k, WinXP]
gedd © (2003-08-11 10:51:00)
Кто нибудь знает как сделать многопотовый загрузчик файлов
компоненты idhttp idftp не подходят!
gedd (2003-08-14 10:12:00) [1]
хорошо открываю новую ветку
Zelius (2003-08-14 10:12:00) [2]
> gedd
я только на инди качал, с WinInet ом так и не подружился, не разобрался с асинхронностью... зато все что угодно и пркокся не помеха
MACTEP (2003-08-14 10:09:00) [3]
будет написано "задай свой вопрос в новой ветке" гыгыгыгы)
может даже "гыгыгыгы" напишут
;))))
gedd (2003-08-14 10:04:00) [4]
а почему удалят то
MACTEP (2003-08-14 10:03:00) [5]
удалят жы твой пост, нисмышлёныш
gedd (2003-08-14 10:01:00) [6]
Ребятки
Ваша перепалка конечно классная но хотелось бы работать не через
инди, а через общие протоколы типа WinInet овских
с компонентом инди IdHTTP были проблемы с кодировками
приведите пожалуйста пример
как можно скачать любойфайл (*.http, *.rar и т.д.)
Вопрос с размером файла решил. Но ...
Как используя WinInet пройти через прокси сервер.
Zelius (2003-08-13 18:36:00) [7]
нет, именно в инди, не надо брать на себя лишнее, типа, размер потока устанавливать. :)
nikkie (2003-08-13 18:31:00) [8]
так может тогда проблема все ж таки не в инди? ;)
Zelius (2003-08-13 18:27:00) [9]
> nikkie © (13.08.03 18:00) [46]
не повершь, это была моя первая мысль! я отключил изменение размера, но почему-то были неуловимые глюки, периодически файлы скачивались не правильно, пришлось отказаться от этой идеи.
nikkie (2003-08-13 18:00:00) [10]
ок, наконец понял, что ты пытаешься делать - создаешь TFileStream с флагом fmShareDenyNone в каждом потоке на один и тот же файл.
ну допустим создатели инди не предусмотрели именно такое использование и именно с TFileStream. допустим, так, как ты хочешь, не работает, потому что мешает AdjustStreamSize. а кто тебе мешает сделать свой TFileStream просто переопределив SetSize?
Zelius (2003-08-13 17:12:00) [11]
> nikkie © (13.08.03 17:03) [44]
ну не скажи, можно, у меня прекрасно работает.
ведь есть же такая вещь, как fmShareDenyRead и fmShareDenyWrite, открываешь дважды файл с соответсвующими флагами и все. дело в том, что каждый поток пишет в свою не пересекающуюся часть файла, поэтому никаких проблем не возникает, пиши себе в поток не задумываясь...
nikkie (2003-08-13 17:03:00) [12]
>Zelius
забудь про инди. покажи мне код, который будет писать сразу в два места в файле, а то у меня фантазии не хватает. два потока (streams) на запись одного файла открыть нельзя. писать в один stream из двух разных threads - это как же изголиться надо... во-первых, постоянно синхронизироваться надо, во-вторых, в каждом thread надо запоминать position после записи кусочка и устанавливать position перед каждой записью.
Zelius (2003-08-13 16:22:00) [13]
проехали, забудь!
Reindeer Moss Eater (2003-08-13 16:18:00) [14]
Ну и где здесь противоречие тому что я говорил?
Библиотека сама пишет данные в поток, переданный в качестве параметра?
Библиотека не может писать не с начала потока?
Библиотека не может закачивать параллельно в N потоков?
Zelius (2003-08-13 16:01:00) [15]
> 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 15:54:00) [16]
Просто если бы Инди не выставляла размер потока как она это делает.
До парня никак не доходит, что это делает не Indy.
Zelius (2003-08-13 15:52:00) [17]
> nikkie © (13.08.03 13:34) [37]
Да, скачиваю большой файл, открываю несколько файловых потоков на один файл и пишу прямо туда. С партиальной скачкой файлов у меня нет проблем, да у меня и вообще нету с этим проблем, все давно работает. Просто если бы Инди не выставляла размер потока как она это делает, то не пришлось бы рожать промежуточных буферов. Вот и все что я хотел сказать :)
Reindeer Moss Eater (2003-08-13 13:35:00) [18]
"Ему так надо" :)
nikkie (2003-08-13 13:34:00) [19]
>Zelius
по поводу From вместо ContentRangeStart - виноват, ошибся. помнил, что это задается в Request, но быстрым взглядом промахнулся.
и все равно, проблемы твоей я не понимаю. речь идет о многопотоковой закачке? и ты хочешь, чтобы 2 потока (threads) писали в один поток (stream)?
Reindeer Moss Eater (2003-08-13 13:29:00) [20]
Собирай данные в памяти, и пиши поблочно в свой файл наздоровье, соблюдая нужные смещения.
Вот это видел? Читал? Буквы понял?