Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

многопотовый загрузчик файлов [D7, Win2k, WinXP]


Страницы:   1 2 3

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]

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

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


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо