Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

C++, CppWebBrowser, проблема поймать завершение загрузки страницы

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Компилируемые языки] >> C++, CppWebBrowser, проблема поймать завершение загрузки страницы
Имя
Сообщение << Старые топики   Новые топики >>
C++, CppWebBrowser, проблема поймать завершение загрузки страницы - 2009-08-22 00:00:46.583333   
Time

Сообщений: 96
Оценки: 0
Присоединился: 2007-01-29 12:36:37.266666
С компонентой CppWebBrowser работаю недавно.
В CppWebBrowser поочерёдно загружаю несколько страниц (в цикле). Проблема поймать окончание загрузки каждой, с целью её обработки в момент завершения (к примеру сохранить её текст и т.п.). Т.е. перед тем как CppWebBrowser приступит к загрузке следущей страницы цикла он должен завершить отображение предыдущий.
У меня же получается, что из всех страниц цикла, в процессе отображается только последняя, а остальные как бы не успевают загружатся до конца. Каким образом программно можно приостановить загрузку следущей страницы, пока не закончила загрузку предыдущая или как определить что страница полностью загружена, подскажите пожалуйста?

p.s. через NavigateComplete2, DownloadComplete и т.п.события завершение загрузки страниц отследить не получилось…
Post #: 1
RE: C++, CppWebBrowser, проблема поймать завершение загрузки страницы - 2009-08-22 09:51:32.676666   
AnT1b1oT1k

Сообщений: 50
Оценки: 0
Присоединился: 2009-03-17 01:02:53.560000
на С++ Builder в компонентах есть таймер м.б он поможет?
Post #: 2
RE: C++, CppWebBrowser, проблема поймать завершение загрузки страницы - 2009-08-22 10:41:07.610000   
Time

Сообщений: 96
Оценки: 0
Присоединился: 2007-01-29 12:36:37.266666
Да, Timer тоже пробывал. Таким образом.. Запускаем его при начале загрузке страницы по событию BeforeNavigate2 на несколько секунд.. К сожалению за этот период в окне наблюдается просто белый экран а загрузка завершается только после остановки таймера(
Как ещё его можно попробывать использовать?
Post #: 3
RE: C++, CppWebBrowser, проблема поймать завершение загрузки страницы - 2009-08-23 11:00:07.263333   
IceLifer

Сообщений: 15
Оценки: 0
Присоединился: 2009-08-06 17:40:45.046666
Примерно так:
#include &lt;vcl.h&gt; #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma link "SHDocVw_OCX" #pragma resource "*.dfm" TForm1 *Form1; bool download; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::CppWebBrowser1DocumentComplete(TObject *Sender, LPDISPATCH pDisp, Variant *URL) { } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { CppWebBrowser1-&gt;Navigate(WideString("www.yandex.ru")); } //--------------------------------------------------------------------------- void __fastcall TForm1::CppWebBrowser1DownloadBegin(TObject *Sender) { download=true; } //--------------------------------------------------------------------------- void __fastcall TForm1::CppWebBrowser1ProgressChange(TObject *Sender, long Progress, long ProgressMax) { ProgressBar1-&gt;Max=ProgressMax; ProgressBar1-&gt;Position=Progress; if (CppWebBrowser1-&gt;ReadyState==4&&download==true) { download=false; ShowMessage("Finish"); } } //---------------------------------------------------------------------------
Post #: 4
RE: C++, CppWebBrowser, проблема поймать завершение загрузки страницы - 2009-08-23 11:39:34.546666   
Time

Сообщений: 96
Оценки: 0
Присоединился: 2007-01-29 12:36:37.266666
К сожалению через CppWebBrowser1->ReadyState==4 я тоже уже пробывал.. не помогло ..
Щас вот тока что ещё раз закодил - не работает. И по прежнему на контрольной точке, в тот момент когда страница якобы должна завершить загрузку, явно внутри браузера пусто..(
Post #: 5
RE: C++, CppWebBrowser, проблема поймать завершение загрузки страницы - 2009-08-23 12:26:06.543333   
IceLifer

Сообщений: 15
Оценки: 0
Присоединился: 2009-08-06 17:40:45.046666
Странно,но код рабочий.
Post #: 6
RE: C++, CppWebBrowser, проблема поймать завершение загрузки страницы - 2009-08-23 12:43:27.403333   
Time

Сообщений: 96
Оценки: 0
Присоединился: 2007-01-29 12:36:37.266666
Да он рабочий… но работает только для одной страницы.
А когда подряд в цикле идёт загрузка нескольких страниц, то срабатывает только для последней.
Post #: 7
RE: C++, CppWebBrowser, проблема поймать завершение загрузки страницы - 2009-08-23 12:50:17.863333   
IceLifer

Сообщений: 15
Оценки: 0
Присоединился: 2009-08-06 17:40:45.046666
Он рабочий и рабочий для каждой страницы,просто загрузка считаеться для каждого фрейма.
Post #: 8
RE: C++, CppWebBrowser, проблема поймать завершение загрузки страницы - 2009-08-23 13:21:25.080000   
Time

Сообщений: 96
Оценки: 0
Присоединился: 2007-01-29 12:36:37.266666
Как тогда объяснить что браузер не отображает на экран содержимое страниц при зацикленной загрузке в него?

p.s. пусть код рабочий, но проблема то не решилась..( есть ещё какие-нибудь мысли?
Post #: 9
RE: C++, CppWebBrowser, проблема поймать завершение загрузки страницы - 2009-08-23 13:46:15.103333   
IceLifer

Сообщений: 15
Оценки: 0
Присоединился: 2009-08-06 17:40:45.046666
Увеличивать шаг цикла ориентируюсь только на св-во busy у браузера я бы так попробывал.
Post #: 10
RE: C++, CppWebBrowser, проблема поймать завершение загрузки страницы - 2009-08-23 21:06:10.376666   
Time

Сообщений: 96
Оценки: 0
Присоединился: 2007-01-29 12:36:37.266666
Через Busy попробывал…
Когда зацикливаю.. while (CppWebBrowser-&gt;Busy) окно зависает..
Получается, то что браузер всегда Busy.. почему так?
Пробывал это зацикливание сразу после Navigate и в событии ProgressChange. эффект одинаковый..

Post #: 11
RE: C++, CppWebBrowser, проблема поймать завершение загрузки страницы - 2009-08-24 02:35:22.946666   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Зависает потому что перестаёт нормально работать цикл обработки сообщений.
Post #: 12
RE: C++, CppWebBrowser, проблема поймать завершение загрузки страницы - 2009-08-24 16:29:54.226666   
Time

Сообщений: 96
Оценки: 0
Присоединился: 2007-01-29 12:36:37.266666
А почему он перестаёт нормально работать? как заставить сообщения правильно обрабатываться?
Решения пока так и не нашёл… хелп…
Post #: 13
RE: C++, CppWebBrowser, проблема поймать завершение загрузки страницы - 2009-08-24 18:55:30.813333   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Разбираться с асинхронностью. Прочитать про то, что такое очередь сообщений и т.д.
Post #: 14
RE: C++, CppWebBrowser, проблема поймать завершение загрузки страницы - 2009-08-25 13:25:16.623333   
Time

Сообщений: 96
Оценки: 0
Присоединился: 2007-01-29 12:36:37.266666
Где бы найти такую инфу про особенности асинхронности загрузки именно CppWebBrowser?
Через поисковики проблематично найти что-то конкретное..
Post #: 15
RE: C++, CppWebBrowser, проблема поймать завершение загрузки страницы - 2009-08-25 16:03:12.126666   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333

quote:

ORIGINAL: Time

Где бы найти такую инфу про особенности асинхронности загрузки именно CppWebBrowser?
Через поисковики проблематично найти что-то конкретное..


Тебе не надо именно CppWebBrowser. Тебе надо фундаментальных знаний о работе оконных приложений.

Попробую на пальцах объяснить. Грубо говоря, существует функция обработки всех приходящих в окно сообщений. Т.е. ты дёрнул мышь - вызвался обработчик, отработал, сделал действия, закончился. Нажал кнопку на клаве - обработалось нажатие. В процессе работы конкретного обработчика (всякие OnEvent) - главное окно "зависает", т.к. другие события ожидают своей обработки в очереди сообщений, в том числе и функция перерисовки окна. Т.е. пока ты не закончишь обрабатывать текущее действие - другие выполнятся (перерисовки и пр.) не будут. Ты же в обработчике делаешь цикл с неопределённым условием окончания => до остальных обработчиков очередь так и не доходит.
Т.е. свой цикл ожидания чего-то там нужно делать асинхронно, а не в обработчике. А по достижении результата отправить сообщение (сгенерировать эвент).
Post #: 16
RE: C++, CppWebBrowser, проблема поймать завершение загрузки страницы - 2009-08-25 16:37:11.293333   
Time

Сообщений: 96
Оценки: 0
Присоединился: 2007-01-29 12:36:37.266666
Огромное спасибо всем за поддержку и участие в решение проблемы! Только что сам нашёл выход 
Так как по циклу он загружать не хотел, то я его "выкинул" и стал вызывать нажатие кнопки в ProgressChange.
Туда же запихнул Busy, который наконец то заработал! Короче примерно так:
void __fastcall TForm1::Button1Click(TObject *Sender) { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CppWebBrowser2-&gt;Navigate(WideString("ссылка")); } void __fastcall TForm1::CppWebBrowser2ProgressChange(TObject *Sender, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long Progress, long ProgressMax) { if(!(CppWebBrowser2-&gt;Busy)) &nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp; //обрабатываем страничку&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; Form1-&gt;Button1-&gt;Click(); } }
темка закрыта)

Post #: 17
Страниц:  [1]
Все форумы >> [Компилируемые языки] >> C++, CppWebBrowser, проблема поймать завершение загрузки страницы







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.