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

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

OnDownloadComplete или не OnDownloadComplete - вот в чем вопрос [D5]


Страницы:   1 2

ИМХО ©   (2004-08-17 16:26:00) 

Использую в своей проге невидимый TWebBrowser.
Как гарантированноузнать, что загрузка страницы завершена?

Дело в том, что OnDownloadComplete вызывается неоднократно при открытии одной страницы - значит это событие не подходит?

OnNavigateComplete2? Или OnDocumentComplete?


Ihor Osov'yak   (2004-08-19 01:58:00) [21]

> никто не мешает вам вставлять sleep(100)

и получить еще больше проблем. Подсказка - для начала проведите измерения времени загрузки сайта со слипом и без слипа. Желательно несколько более насыщеного картимками, чем делфимастер. И сравнить количество успешно заргуженных картинок со слипом и без слипа.

> ничего подобного, можете провести эксперименты.
> Хотите - напишем тестовую программу и посмотрим насколько сильна загрузка процессора.

Молодой человек, я уже вышел из того возраста, чтобы в публичном месте разбрасываться непроверенными сведениями. Если сведения непроверенные, то бышь предположение - я всегда указываю на это.

> - напишем тестовую программу и посмотрим насколько сильна загрузка процессора.

Напишите, посмотрите. Я вам даже подскажу  - веббровзер там ни причем.
Напишите просто

procedure TForm1.Button1Click(Sender:   TObject);
begin
Repeat
  Application.ProcessMessages;
Until false;
end;

кликните на бутон и понаблюдайте на загрузку процессора.
Кстати, "проверка" здесь действует еще быстрее, и как бы должна меньше нагружать процессор.  

> А вместо того, чтобы мудрить - лучше сделать так

В данной ситуации это относится к Вам. Проведите маленький эксперимент и подумайте над тем, что увидели, и почему так происходит..

Зы. В даный момент времени я нарушаю одно из своих правил - шлю ответ, практически его не проверив. По двум причинам - первая - у меня сейчас делается пересжатие одного видиоролика и процессор и так на 100 процентов загружен - то есть у меня просто нет возможногсти сейчас сделать эксперимент...
Во вторых - такой эксперимент я делал несколько лет назад. С последующим размышлением на тему почему этот внешне безобидный код приводит почти к 100 процентной загрузке процессора. И как с этим бороться.


Piter   (2004-08-19 01:39:00) [22]

Ihor Osov'yak ©   (19.08.04 1:11) [9]
и в мало мальски серьезном проекте получишь кучу проблем


например?

Начиная от  очень сильной загрузки процессора

ничего подобного, можете провести эксперименты. Более того, никто не мешает вам вставлять sleep(100) или типа того. Хотя опять же проверка действует очень быстро. Хотите - напишем тестовую программу и посмотрим насколько сильна загрузка процессора. А вместо того, чтобы мудрить - лучше сделать так. Думаю, это то, что и требуется ИМХО.


Ihor Osov'yak   (2004-08-19 01:11:00) [23]

2 [8] Piter ©   (19.08.04 00:48)

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


Piter   (2004-08-19 00:48:00) [24]

Я бы сделал так:

procedure TForm1.Button1Click(Sender:   TObject);
begin
 WebBrowser1.Navigate(' http://www.delphimaster.ru');

 Repeat
   Application.ProcessMessages;
 Until (WebBrowser1.readyState = 4);

 showmessage('Готово');
end;


Ihor Osov'yak   (2004-08-19 00:35:00) [25]

> MS IE показывает в статус-панели: Done

А, тогда OnDocumentComplete. Причем (pDisp as IWebBrowser2) должен относиться к тому броузеру, который инициализировал навигацию (для многофреймового документа, для однофреймового на pDisp  можно внимания не обращать). Здесь под броузером понимается не TWebBrowser, а некая сущность, внутри соотв. активХ, и которая предоставляет соотв. IWebBrowser2.

Как определить броузер - инициатор? В первом OnBeforeNavigate (pDisp as IWebBrowser) как раз будет и он..

Зы. Нужно учитывать вероятность того, что OnDocumentComplete вследствие ранее упормянутого глючка может не возникнуть. Если по логике приложения это критично - можно попытаться по таймеру анализировать IWebBrowser.ReadyState инициатора навигации. Есть и другие методы, но они более сложные в реализации и не дают очевидного преимущества. Например, подписка на нотификацию от IHtmlDocument2, либо анализ на протокольном уровне.

Зы2. Спич от "Зы" есть мое личное мнение.


ИМХО   (2004-08-18 12:40:00) [26]

Когда прекращаются обращения TWebBrowser'а к запрашиваемому узлу.

MS IE показывает в статус-панели: Done


Ihor Osov'yak   (2004-08-18 11:40:00) [27]

2 [3] ИМХО ©   (18.08.04 07:22)

Так все же для начала нужно определить, что имеется в виду под "полной загрузкой".


Rouse_   (2004-08-18 09:24:00) [28]

Ну так:
> Один из вариантов -  сравнивать pDisp с defaultInterface
> броузера, естественно приводя оба к IUnknown, примерно так:


ИМХО   (2004-08-18 07:22:00) [29]

Игорь, так какой ответ на вопрос? Каким событием TWebBrowser'а пользоваться для проверки полной загрузки?

Или нет решения?


Ihor Osov'yak   (2004-08-18 02:46:00) [30]

> Не забывай что на странице могут быть несколько фреймов
Для корневого фрейма OnDocumentComplete будет возбуждаться последним, уже после OnDocumentComplete вложенных фреймов.  Как определить, что соотв. OnDocumentComplete относиться к корневому фрейму? Один из вариантов -  сравнивать pDisp с defaultInterface броузера, естественно приводя оба к IUnknown, примерно так:

 if ((pDisp as IUnknown) = (WB.DefaultInterface as IUnknown)) then
 begin

Зы. IE имеет маленький глючек, проявляющийся в том, что не всегда OnDocumentComplete возникает по завершению загрузки (глючек появился где-то на уровне IE5.5, в шестерке не исчез) - глючек заметно чаще появляется на нестабильном канале. Как красиво обойти этот глючек - не знаю, особо не искал, не было актуальным - так  как в вещах, которые делал, меня удовлетворяла тупая проверка по таймеру контекста страницы..

Зы2. OnDocumentComplete говорит не о том, что документ загрузился полностью, а лишь о том, что загрузка окончилась, то есть больше не продолжается . Задача определить действительно ли полностью документ загрузимся, или только окончена загрузка с потерей части документа - на уровне TWebBrowser решить нельзя, во всяком случае я решения не нашел, также не встречал публикаций на эту тему. Когда этот вопрос мне был актуальным - решал его на протокольном уровне.


Rouse_   (2004-08-17 16:30:00) [31]

Unlike the OnNavigateComplete2 event, OnDownloadComplete occurs even if the Web browser does not successfully navigate to an URL

Не забывай что на странице могут быть несколько фреймов, а также баннеры которые режутся...


Страницы:   1 2

Наверх

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