Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.09.2007, 18:47   #1
AVer
Андрей
Форумчанин
 
Аватар для AVer
 
Регистрация: 21.11.2006
Сообщений: 457
По умолчанию Многопоточность Indy

Кругом только и написано: "Преимуществом Indy является многопоточность при блокирующих сокетах...", а на деле я столкнуся с реальной проблемой:
Мне надо выполнить IdHhtp.Get() в нескольких потоках. Че не находил - нихрена не понял. Народ, помогите конкретным примером...
ICQ: 5311314
[SIGPIC][/SIGPIC]
AVer вне форума Ответить с цитированием
Старый 24.09.2007, 09:56   #2
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

Ты не так понял дивиз Indy под многопоточностью там понимается лишь "каждому коннекту свой поток" не более)
Для реализации "скачивания" конкретного файла в несколько потоков лучше использовать методы, отличные от Indy.
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Старый 04.02.2009, 16:32   #3
Viteef
stopfake.org
Участник клуба
 
Регистрация: 03.05.2007
Сообщений: 1,927
По умолчанию

Цитата:
лучше использовать методы, отличные от Indy.
Тема не раскрыта Какие способы возможны?

http://www.google.com/search?client=...utf-8&oe=utf-8
Viteef вне форума Ответить с цитированием
Старый 04.02.2009, 17:13   #4
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

ну чтож, можно реализовать, кпримеру, так: узнаем размер удаленного файла:
Код:
function GetUrlInfo(const dwInfoLevel: DWORD; const FileURL: string):
string;
var
  hSession: HINTERNET;
  hService: HINTERNET;
  FileSize: Longint;
  dwSize, Reserved: DWORD;
  buf: String;
begin
  hSession := InternetOpen( 'MyApp', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0 );
  if Assigned( hSession ) then
  begin
    hService := InternetOpenUrl(hSession, PChar(FileURL), nil, 0, 0, 0);
    if Assigned( hService ) then
    begin
      dwSize := sizeof(FileSize); //what does this do? FileSize isn't anything yet is it??
      Reserved := 0;
      HttpQueryInfo(hService, HTTP_QUERY_CONTENT_LENGTH or HTTP_QUERY_FLAG_NUMBER,
                    @FileSize, dwSize, Reserved); //get the size
      result := inttostr(filesize); //convert to a string
    end;
    InternetCloseHandle( hService );
  end;
  InternetCloseHandle( hSession );
end;
соответственно вызов:
Код:
GetUrlInfo(HTTP_QUERY_CONTENT_LENGTH,<URL>);
затем генерируем n-е число стандартных потоков, в каждом из которых создаем IdTcpClient, коннектимся к удаленному узлу и читаем из удаленного файла некое число байт, каждый поток, соответственно, начинает чтение файла не сначала. Думаю идея понятна. Способ весьма кривой, на самом делеи достаточно спорный по поводу конфликтов ресурсов между потоками.
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Старый 04.02.2009, 17:42   #5
Viteef
stopfake.org
Участник клуба
 
Регистрация: 03.05.2007
Сообщений: 1,927
По умолчанию

у меня задача 1 файл в 1 поток.

т.е. все сводиться к
Цитата:
генерируем n-е число стандартных потоков, в каждом из которых создаем IdTcpClient, коннектимся к удаленному узлу
Квэнди, спасибо.
Viteef вне форума Ответить с цитированием
Старый 04.02.2009, 18:18   #6
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

если один файл в один поток, то лучше не заморачиваться с разделением файла на байтовые последовательности а качать весь. Тогда в каждом потоке создаем Idhttp и GET-м забираем файл
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Старый 05.02.2009, 02:33   #7
Viteef
stopfake.org
Участник клуба
 
Регистрация: 03.05.2007
Сообщений: 1,927
По умолчанию

Цитата:
Сообщение от Квэнди Посмотреть сообщение
если один файл в один поток, то лучше не заморачиваться с разделением файла на байтовые последовательности а качать весь. Тогда в каждом потоке создаем Idhttp и GET-м забираем файл
Так и сделал. На некоторых сайтах возникает ошибка connection reset by peer и цикл с GET'ом останавливается. Пример такогих сайтов - offtopa.net, dragonfever.info.

Последний раз редактировалось Viteef; 05.02.2009 в 02:35.
Viteef вне форума Ответить с цитированием
Старый 05.02.2009, 09:41   #8
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

Воспользуйся Request.KeepAlive в компоненте IdHttp должно помочь.
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Старый 05.02.2009, 14:38   #9
Viteef
stopfake.org
Участник клуба
 
Регистрация: 03.05.2007
Сообщений: 1,927
По умолчанию

Цитата:
Сообщение от Квэнди Посмотреть сообщение
Воспользуйся Request.KeepAlive в компоненте IdHttp должно помочь.
Код:
idhttp1.request.ProxyConnection:='Keep-Alive';
не помогло...
Viteef вне форума Ответить с цитированием
Старый 05.02.2009, 18:02   #10
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

а, если в цикле, то после каждого GET-а делай idhttp.Disconnect так будет правильней и , по идее, не должно возникать сброса сессии удаленным хостом
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
многопоточность в Delphi xakkkkker Свободное общение 12 13.08.2010 18:52
как обновить indy 9 на indy 10 Пилигрим Компоненты Delphi 16 30.04.2010 10:11
Indy 9 против Indy 10 OrdJONY Свободное общение 2 08.11.2008 20:28
многопоточность в сетевых приложениях AlexandrY Работа с сетью в Delphi 9 13.07.2008 02:43
IRC в Indy Zer0 Работа с сетью в Delphi 2 12.02.2008 09:57