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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.03.2011, 00:09   #1
Alar
Александр
Администратор
 
Аватар для Alar
 
Регистрация: 28.10.2006
Сообщений: 17,501
По умолчанию idhttp как узнать что страница скачана/загружена до конца?

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

http://programmersforum.ru/showthread.php?t=133875

Сейчас получил вот такой код, но он не работает. есть идеи?

цель - дождаться загрузки страницы, перед тем как перейти к загрузке следующей.
Код:

unit work;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
  IdHTTP, StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    Memo2: TMemo;
    Memo3: TMemo;
    Memo4: TMemo;
    IdHTTP1: TIdHTTP;
    procedure Button1Click(Sender: TObject);
    procedure IdHTTP1Work(Sender: TObject; AWorkMode: TWorkMode;
      const AWorkCount: Integer);
    procedure IdHTTP1WorkBegin(Sender: TObject; AWorkMode: TWorkMode;
      const AWorkCountMax: Integer);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
   download_status:integer;
   WorkCountMax, WorkCount:integer;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
label a;
begin
for i:=0 to memo1.Lines.Count-1 do
  begin
   download_status:=1;
   memo2.text:=idhttp1.Get('http://'+memo1.Lines[i]);

   while WorkCount<>WorkCountMax do
   application.ProcessMessages;
  end;
end;

procedure TForm1.IdHTTP1Work(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCount: Integer);
begin
 WorkCount:=AWorkCount
end;

procedure TForm1.IdHTTP1WorkBegin(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCountMax: Integer);
begin
  WorkCountMax:=AWorkCountMax;
end;

end.
Вот здесь подвисает цикл хотя по логике WorkCount должно сравняться с WorkCountMax
Код:
while WorkCount<>WorkCountMax do
   application.ProcessMessages;
Alar вне форума Ответить с цитированием
Старый 28.03.2011, 01:27   #2
uberchel
Участник клуба
 
Аватар для uberchel
 
Регистрация: 19.01.2009
Сообщений: 1,453
По умолчанию

может что то не так понял, но а пробовал try finally ?
uberchel вне форума Ответить с цитированием
Старый 28.03.2011, 01:57   #3
Alar
Александр
Администратор
 
Аватар для Alar
 
Регистрация: 28.10.2006
Сообщений: 17,501
По умолчанию

Цитата:
Сообщение от uberchel Посмотреть сообщение
может что то не так понял, но а пробовал try finally ?
а чем это поможет?

Сделал более визуально отслеживаемый вариант, на третей итерации спотыкается.

на форме memo1 со списком юрлов без http
кнопка и 3 label

Ушёл спать. может за ночь что-нибудь придумаю или кто подскажет

Код:
unit work;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
  IdHTTP, StdCtrls, IdAntiFreezeBase, IdAntiFreeze;


 Type TTransferThread = Class(TThread)
private
{ Private declarations }
FIdHTTP : TIdHTTP;
FConnected: Boolean;
FFileList : TStringList;
public
{ Public declarations }
WorkCountMax: Integer;
WorkCount : Integer;
constructor Create(CreateSuspended: Boolean);
destructor Destroy; override;
procedure IdHTTP1Work (Sender: TObject; AWorkMode: TWorkMode; const AWorkCount : Integer);
procedure IdHTTP1WorkEnd (Sender: TObject; AWorkMode: TWorkMode);
procedure IdHTTP1WorkBegin(Sender: TObject; AWorkMode: TWorkMode; const AWorkCountMax: Integer);
procedure Execute; override;
end;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    Memo2: TMemo;
    Memo3: TMemo;
    Memo4: TMemo;
    IdHTTP1: TIdHTTP;
    Button2: TButton;
    IdAntiFreeze1: TIdAntiFreeze;
    Label1: TLabel;
    Label2: TLabel;
    Label0: TLabel;
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    TransferThread: TTransferThread;
procedure UpdateCaption();
  end;

var
  Form1: TForm1;
   checkcount:integer;
implementation

{$R *.dfm}

{ TTransferThread }
constructor TTransferThread.Create(CreateSuspended: Boolean);
begin
inherited;
FFileList:= TStringList.Create;
FIdHTTP := TIdHTTP.Create(nil);
end;

destructor TTransferThread.Destroy;
begin
FIdHTTP.Free;
FFileList.Free;
inherited;
end;

procedure TTransferThread.Execute;
var i: Integer;
label a;
begin
FIdHTTP.OnWork:=IdHTTP1Work;
FIdHTTP.OnWorkBegin:=IdHTTP1WorkBegin;
FIdHTTP.OnWorkEnd:=IdHTTP1WorkEnd;

for checkcount:=0 to form1.memo1.lines.Count-1 do
begin

   form1.memo2.text:=FIdHTTP.Get('http://'+form1.memo1.Lines[checkcount]);

while form1.label1.caption<>form1.label2.caption do  application.ProcessMessages;
   end;

end;

procedure TTransferThread.IdHTTP1Work(Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer);
begin
WorkCount := AWorkCount;
Synchronize(Form1.UpdateCaption);
end;

procedure TTransferThread.IdHTTP1WorkBegin(Sender: TObject; AWorkMode: TWorkMode; const AWorkCountMax: Integer);
begin
FConnected:=True;
WorkCountMax:=AWorkCountMax ;
Synchronize(Form1.UpdateCaption);
end;

procedure TTransferThread.IdHTTP1WorkEnd(Sender: TObject; AWorkMode: TWorkMode);
begin
FConnected:=False;
Synchronize(Form1.UpdateCaption);
end;

 procedure TForm1.UpdateCaption();
begin

Label0.Caption:=(inttostr(checkcount));
Label1.Caption:=(inttostr(TransferThread.WorkCount));
Label2.Caption:=(inttostr(TransferThread.WorkCountMax));

end;

procedure TForm1.Button1Click(Sender: TObject);
begin
TransferThread:=TTransferThread.Create(True);
TransferThread.Resume;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
checkcount:=0;
end;

end.
Alar вне форума Ответить с цитированием
Старый 28.03.2011, 13:53   #4
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

Ошибку в студию.
а вот так:
Код:
while form1.label1.caption<>form1.label2.caption do  application.ProcessMessages;
   end;
делать лучше не надо
application.ProcessMessages;
лучше писать в IdHTTP1Work
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Старый 28.03.2011, 14:04   #5
Alar
Александр
Администратор
 
Аватар для Alar
 
Регистрация: 28.10.2006
Сообщений: 17,501
По умолчанию

Второй код вполне рабочий. Запустил приложение без Delphi - есть один сайт на котором проиходит зависание. этот сайт был просмотрен в браузере и был заметен редирект на www. Это исправимо
Alar вне форума Ответить с цитированием
Старый 28.03.2011, 14:08   #6
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

сама по- себе проверка:
form1.label1.caption<>form1.label2. caption
не надежна, поэтому велика вероятность безконечного цикла.
А не надежна она потому, что страница может отдать один content-length, а какой- нибудь быдлокодер сделает там подгрузку на js-е чего -нибудь куда- нибудь...
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Старый 28.03.2011, 14:12   #7
Alar
Александр
Администратор
 
Аватар для Alar
 
Регистрация: 28.10.2006
Сообщений: 17,501
По умолчанию

Цитата:
Сообщение от Квэнди Посмотреть сообщение
Ошибку в студию.
а вот так:
Код:
while form1.label1.caption<>form1.label2.caption do  application.ProcessMessages;
   end;
делать лучше не надо
application.ProcessMessages;
лучше писать в IdHTTP1Work
Действительно работает. Хотя этот вариант рассматривался прежде всего. в любом случае редирект надо обрабатывать на www. Подвисает аналогично моему варианту
Alar вне форума Ответить с цитированием
Старый 28.03.2011, 18:16   #8
GreyScall
Пользователь
 
Аватар для GreyScall
 
Регистрация: 01.01.2011
Сообщений: 29
По умолчанию

TIdHTTP работает синхронно... То есть пока файл не загрузится полностью управление не передаётся дальше... Это для какого-нибудь TWebBrowser'а нужно проверку делать "полностью ли загрузилось"...
Код:
Procedure TForm1.Button1Click(Sender: TObject);
Var i, n: integer;
Begin
n:=Memo1.Lines.Count-1;
ProgressBar1.Position:=0;
ProgressBar1.Max:=n+1;
For i:=0 To n Do
      Begin
      Memo2.Text:=IdHTTP1.Get('http://'+Memo1.Lines[i]);
      ProgressBar1.Position:=i+1;
      Application.ProcessMessages;
      End;
End;

Procedure TForm1.IdHTTP1Work(Sender: TObject; AWorkMode: TWorkMode; Const AWorkCount: Integer);
Begin
ProgressBar2.Position:=AWorkCount;
Application.ProcessMessages;
End;

Procedure TForm1.IdHTTP1WorkBegin(Sender: TObject; AWorkMode: TWorkMode; Const AWorkCountMax: Integer);
Begin
ProgressBar2.Position:=0;
ProgressBar2.Max:=AWorkCountMax;
Application.ProcessMessages;
End;
В чём выражается "подвисает"?
Regards, GreyScall.
GreyScall вне форума Ответить с цитированием
Старый 28.03.2011, 19:14   #9
Alar
Александр
Администратор
 
Аватар для Alar
 
Регистрация: 28.10.2006
Сообщений: 17,501
По умолчанию

Цитата:
Сообщение от GreyScall Посмотреть сообщение
В чём выражается "подвисает"?
Если запускать не из среды. то при возникновения редиректа - программа зависает, но, теперь, поняв эту ошибку, я могу сделать обработчик редиректа.
Alar вне форума Ответить с цитированием
Старый 29.03.2011, 13:38   #10
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

Цитата:
То есть пока файл не загрузится полностью управление не передаётся дальше...
не совсем так. для передачи управления в процессе загрузки есть синхронизирующие события onwork...
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
WebBrowser как узнать что страница полностью догрузилась Comer_Jus Работа с сетью в Delphi 6 01.07.2011 09:46
как узнать что страница в WebBrowser загружена designer999 Работа с сетью в Delphi 2 05.05.2010 21:12
Как узнать что пролистал до конца компонент RichEdit SomlicH Помощь студентам 1 04.12.2009 22:23
Узнать какая страница загружена. Port 111 Работа с сетью в Delphi 6 14.01.2009 22:26
Как узнать загрузилась ли страница в webbrowser? Pedro Работа с сетью в Delphi 5 22.08.2007 22:00