Модераторы: Snowy, Poseidon, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблем с InternetOpen 
V
    Опции темы
ftooper
Дата 27.9.2011, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 14.4.2011

Репутация: нет
Всего: нет



Здравствуйте!
Разрабатываю многопоточное приложение, для работы с сетью использую unit wininet.

Вот код:

Код

procedure GetHttpString(URL:Pchar);
var
  hInet, hFile: HINTERNET;
begin
  hInet:=InternetOpen(nil,INTERNET_OPEN_TYPE_PRECONFIG,nil,nil,0);
  if (hInet<>nil) then begin
    hFile:=InternetOpenUrl(hInet,URL,nil,0,0,0);
    if (hFile<>nil) then begin
        /*
Код
*/
      InternetCloseHandle(hFile);
    end;
    InternetCloseHandle(hInet);
  end else begin
    sleep(10);
  end;
end;


Данная процедура вызывается одновременно в нескольких потоках, проблема в том, что одновременно несколько соединений не устанавливаются, то есть они создаются одно за другим, и одновременно, допустим 10 соединений не устанавливаются.

Если использовать Synapse(httpsend) , то всё хорошо, но мне нужно реализовать многопоточную работу с помощью wininet.

Прошу помочь реализовать правильную многопоточную работу, то есть создать одновременно несколько подключений.
PM MAIL   Вверх
Snowy
Дата 27.9.2011, 19:12 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 53
Всего: 484



Для теста накидал пример:
Код
uses WinInet;

{$R *.dfm}

type
  TDLThread = class(TThread)
    url: string;
    pb: TProgressBar;
    st: TStream;
    procedure Execute; override;
  end;

procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
begin
  for i := 0 to 9 do
  with TDLThread.Create(true) do
  begin
    url := 'http://www.cnpack.org/download/unstable/CnWizards_0.9.9.619_Unstable.exe';
    st := TMemoryStream.Create;
    pb := TProgressBar.Create(Form1);
    pb.Align := alTop;
    pb.Max := 8341986;
    pb.Parent := Form1;
    FreeOnTerminate := True;
    Start;
  end;
end;

{ TDLThread }

procedure TDLThread.Execute;
var
  hS, hR: Hinternet;
  b: array  [0..1023] of byte;
  n: Cardinal;
begin
  hS := InternetOpen ('MultyDL', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
  try
    hR := InternetOpenURL (hS, Pchar(url), nil, 0,0,0);
    try
      repeat
        InternetReadFile (hR, @b[0], sizeof(b), n);
        pb.Position := pb.Position + Integer(n);
        st.Write(b[0], n);
      until n = 0;
    finally
      InternetCloseHandle(hR);
    end;
  finally
    InternetCloseHandle(hS);
  end;
end;
Нормально качает в несколько тредов. А точнее в 4 треда, что составляет максимум одновременных подключений к одному серверу.
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings
MaxConnectionsPerServer = 4
Увеличиваю это число до 10 и спокойно тяну в 10 тредов.
PM MAIL   Вверх
ftooper
Дата 27.9.2011, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 14.4.2011

Репутация: нет
Всего: нет



Спасибо, я не знал про MaxConnectionsPerServer. У меня вообще не было этого параметра в реестре, добавил - всё стало хорошо.
Ещё один вопрос, какое максимальное значение можно устанавливать? (ну просто интересно) и какое значение идёт стандартное, если нет этого ключа?
PM MAIL   Вверх
Snowy
Дата 27.9.2011, 19:58 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 53
Всего: 484



Ну так, чтоб ключа не было - мне не встречалось.
Штатно идет 4.
Обычно твикеры его увеличивают до 20.
Максимально, подозреваю, 65535.
Никаких упоминаний об ограничениях мне не попадалось.
PM MAIL   Вверх
ftooper
Дата 27.9.2011, 21:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 14.4.2011

Репутация: нет
Всего: нет



Спасибо большое за помощь. У меня Windows7, возможно в этом и есть причина отсутствия ключа. Факт то, что после добавления, программа стала работать как я и планировал.
Ещё раз Спасибо.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0441 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.