Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > IdHTTP - отменить GET


Автор: Teran 6.2.2006, 16:28
Когда в своей программе вызываю IdHTTP.POST - программа блокируется "думает"

А как мне сделать так чтобы можно было отменить прием данных например по кнопке "Отмена"
или можно ли както задать максимальное время соединения с сервером? smile

Автор: Snowy 6.2.2006, 16:43
Просто прикрути к IdHTTP IdAntiFreeze

Автор: Teran 6.2.2006, 16:48
а можно както прикрутить к нему Progress??? smile

Автор: Snowy 6.2.2006, 17:55
OnWorkBegin сообщит тебе сколько байт всего.
OnWork сообщит текущее кол-во переданных или принятых байт.
OnWorkEnd сообщит, что все готово.

Автор: Teran 7.2.2006, 15:41
Проблема в том что при одиночном вызове idHHTP.GET функции OnWorkBegin и OnWork вызываются по многу раз

и здесь не узнаеш сколько всего (в общем за период idHHTP.GET ) принято байт
и построить Progress по ним нельзя.

Автор: Snowy 7.2.2006, 16:34
OnWorkBegin вызывается 2 раза:
1-й на отправку, 2-й на прием.
А OnWork так и должен вызываться, пока процесс не завершится.
Лови только прием, если не шлешь на сервер файлы.

Автор: Teran 7.2.2006, 17:51
Когда выполняю пошагово idHHTP.GET получается:

вначале вызвалась IdHTTP1WorkBegin(Sender: TObject; AWorkMode: TWorkMode; const AWorkCountMax: Integer);
где AWorkCountMax=2293

затем сразу же вызлась IdHTTP1Work(Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer);
где AWorkCount=2293

потом опять IdHTTP1WorkBegin(Sender: TObject; AWorkMode: TWorkMode; const AWorkCountMax: Integer);
где AWorkCountMax=1446

за ним - IdHTTP1Work(Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer);
где AWorkCount=1446

и т.д.
Постоянно цифры равны!

здесь нет сразу общей суммы байт и как приделать Progress Bar непонятно? smile


Автор: Snowy 7.2.2006, 18:12
1 раз - это отправка.
2 раз - это прием.
А то что сразу - это потому, что размер передаваемых данных меньше буфера TIdHTTP.
Поэтому процесс проходит за один проход.
Кроме того смотри параметр AWorkMode. Он тебе сообщает что делает - отправляет или принимает.

Автор: Teran 7.2.2006, 19:34
Всервно не пойму как можно вывести ProgressBar если нет общего максимального колличества

(Чему приравнивать ProgressBar.Max:=?????????) smile

и если
Цитата(Snowy @ 7.2.2006, 18:12 Найти цитируемый пост)

Поэтому процесс проходит за один проход.

то как это же можно реализовать smile

Автор: Snowy 7.2.2006, 21:00
На форме IdHTTP1 и IdAntiFreeze1.
У IdHTTP RecvBuferSize = 1
У антифриза OnlyWenIdle = false, IdleTimeOut = 64
Код

procedure TForm1.IdHTTP1Work(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCount: Integer);
begin
  if AWorkMode = wmRead then ProgressBar1.Position := AWorkCount;
end;

procedure TForm1.IdHTTP1WorkBegin(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCountMax: Integer);
begin
  if AWorkMode = wmRead then ProgressBar1.Max := AWorkCountMax;
end;

procedure TForm1.Button1Click(Sender: TObject);
var s: string;
begin
   s := IdHttp1.Get('http://www.vingrad.ru/');
   ShowMessage(s);
end;

Автор: Teran 8.2.2006, 11:05
За код огромнейшее спасибо !
Но если я поставлю
Цитата(Snowy @ 7.2.2006, 21:00 Найти цитируемый пост)

У IdHTTP RecvBuferSize = 1

в место 32768
скорость скачивания страницы не упадёт ?? smile

Автор: Snowy 8.2.2006, 11:08
Конечно упадет. В среднем процентов на 40.
Для модема на 10, для 100Мбит в 2 раза.
Зато ты успеешь заметить как она скачивается smile

Автор: Snowy 30.8.2006, 11:12
А, забыл сказать, если попадутся редиректы, то бегунок может бегать несколько раз.
Тут ничего не поделаешь - один файл - один пробег. Несколько файлов - несколько пробегов.
Будут проблемы - кричите.
Просто на моих 100Мбитах инета бегунок пролетает в момент. Поэтому возможны глюки, которых я просто не успеваю увидеть за долю секунды. Хотя вряд ли.

Буфер подстраивается под размер файла - на маленьких файлах скорость скачивания замедляется - чтобы бегунок пробегал, а не моргнул,
на средних - скорость повышается. На больших - включается максимум.

Автор: Matematik 30.8.2006, 14:16
Кстати на счет первого вопроса.
Как правильно отменить процесс скачивания? Сейчас я в onWork проверяю условие и делаю DisconnectSocket. Может есть более цивилизованный способ?

Автор: Zlo 6.11.2006, 01:37
Цитата(Snowy @  7.2.2006,  18:12 Найти цитируемый пост)
1 раз - это отправка.
2 раз - это прием.
А то что сразу - это потому, что размер передаваемых данных меньше буфера TIdHTTP.
Поэтому процесс проходит за один проход.
Кроме того смотри параметр AWorkMode. Он тебе сообщает что делает - отправляет или принимает. 

А как узнать какое значение у AWorkMode?

Автор: Zlo 6.11.2006, 02:04
понял =)
Код

if AWorkMode=wmRead then idHTTP1.DisconnectSocket;

(иногда хелп всетаки помогает)
Тока вот у меня вопрос, а как это событие отловить в потоке (трейде) где компонент создан? 

Автор: Matematik 6.11.2006, 09:43
Цитата(Zlo @  6.11.2006,  02:04 Найти цитируемый пост)
хелп всетаки помогает

Ты сомневался?  smile 

Цитата(Zlo @  6.11.2006,  02:04 Найти цитируемый пост)
как это событие отловить в потоке (трейде) где компонент создан?  

Код

  TThread2 = class(TThread)
  private
    procedure WorkEventProc(Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer);
  end;

constructor TThread2 .Create;
begin
  FIdHTTP.OnWork := WorkEventProc;
end;

procedure TThread2 .WorkEventProc(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCount: Integer);
begin
  if Terminated then
    (Sender as TIdHTTP).Disconnect;
end;


 smile 

Автор: Zlo 6.11.2006, 16:10
Matematik, извини но че-то у меня не получилось так как ты показал. Я решил сделать по своему вот так:

Код

unit Unit2;

interface

uses
  Classes, SysUtils,IdHTTP, StdCtrls, IdComponent, IdTCPConnection, IdTCPClient,IdCookieManager;

type
  TPMSender = class(TThread)
  idHTTP1:TidHTTP;
  procedure IdHTTP1Work(Sender: TObject; AWorkMode: TWorkMode;
    const AWorkCount: Integer);
  private
    { Private declarations }
    {...}
  protected
    {...}
  public
    {...}
  end;

implementation

uses Unit1;
{$J+}
const
   DataHtmlRead:Boolean=true;
var
    {...}
    
procedure TPMSender.IdHTTP1Work(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCount: Integer);
begin
    if DataHtmlRead= false then
       if AWorkMode=wmRead then idHTTP1.DisconnectSocket;
end;

procedure TPMSender.Execute;
var
 {...}
begin
{...}
end;


Помоги пожалуйста!

Автор: Matematik 6.11.2006, 16:32
Событие забыл установить

Автор: Zlo 6.11.2006, 16:40
Цитата(Matematik @  6.11.2006,  16:32 Найти цитируемый пост)
Событие забыл установить 

а как и где его установить?

Автор: Matematik 6.11.2006, 16:50
Так написал уже
  FIdHTTP.OnWork := WorkEventProc;

Автор: Zlo 6.11.2006, 16:55
Matematik
дык если вставляю 
Код

constructor TPMSender.Create;
begin
  IdHTTP1.OnWork := IdHTTP1Work;
end;

Код не компилится, ругается что нету: 
-Create
-IdHTTP1
-IdHTTP1Work

Автор: MacTep 4.2.2007, 12:14
А трафик можно узнать в мегабайтах или килобайтах, входящий или исходящий, отправленный или полученные методами get и post?

Автор: Matematik 4.2.2007, 14:28
Цитата(MacTep @ 4.2.2007,  12:14)
А трафик можно узнать в мегабайтах или килобайтах, входящий или исходящий, отправленный или полученные методами get и post?

Да. Например. Для 9 подсоедини к IdHTTP TIdLogEvent с вкладки "Indy Intercents", в событиях он Send\Receive считать переданные байты.
В 10 такой способ немного сложней, нельзя напрямую соединить IdHTTP TIdLogEvent нужен дополнительный компонент для их связи (не помню какой).

ЗЫ
лучше бы новую тему создал

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)