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

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

Заставить работать TWebBrowser в потоке из DLL [D7, XP]


Страницы:   1 2

niro--- ©   (2012-03-10 12:25:00) 

Что хотим получить:

В проекте имеется:

(1) Программа (exe)
(2) dll библиотека, создающая поток, и в потоке создающая форму с TWebBrowser-ом на ней.

Программа определяет сколько потоков ей необходимо и столько раз вызывает из DLL экспортируюмую фунцию, которая создает поток. Каждый поток, как я уже отмечал выше, создает модальную форму с TWebBrowser-ом на ней, за тем каждый поток в своем TWebBrowser-e загружает страницу из интернета (для каждого экземпляра своя), происходит переход по определенной ссылке на загруженой странице и сохранение последней страницы в один общий для всех потоков файл через критическую секцию.

Суть проблемы:

Потоки запусаются, окна создаются, TWebBrowser-ы так же создаются, и навигация на первоначальню страницу для каждего экземпляра происходит правильно, но переход по ссылке на загруженой странице происходит не в каждом окне каждого потока, а в последнем запущеном по поряку модальном окне, т.е. такое ощущение, что все потоки работают с последним по счету запущенным экземпляром TWebBrawser-ом, а не каждый со своим... Почему так происходит???


Сергей М.   (2012-03-10 20:58:00) [1]


> sniknik ©   (10.03.12 20:44) [35]


> может связано?


Скорее всего так и есть)

У дельфийской же модальной формы свой цикл выборки/диспетчеризации сообщений, видимо чтобы не городить один огород с "ручным" циклом ТС и нагородил другой - с модальной формой. Со всеми последующими граблями)

А окно WebBrowser'у в подобных задачах в любом случае нужно, хотя бы даже не для визуализации, а для нормального функционирования асинхронных событий. Нужное браузеру окно как и у любого наследника TWinControl создается вызовом HandleNeeded.


DVM   (2012-03-10 20:53:00) [2]


> а вот зачем окна... был где то вопрос про то, что браузер
> не строит "отображение"

Зато браузер исполняет JavaScript, следствием работы которого может быть например загрузка чего-либо еще или изменения в Dom модели документа, да и сама Dom модель хоть и может быть построена без браузера, но с каждым годом это все сложнее и сложнее, т.к. новшества вводятся в HTML не по дням а по часам. Теоретически Chromium Embedded не нуждается в родительском окне и может не лежать на форме, я глубоко не копал его внутренности, но судя по всему это так. Но TChromium не может. TWebBrowser не знаю, скорее нет.


Inovet   (2012-03-10 20:49:00) [3]

> [19] niro---   (10.03.12 19:03)
> Многие об этом говорят, но существуют и диаметрально противоположные
> мнения.

Ты верующий? При чём тут мнение, когда есть документация.


sniknik   (2012-03-10 20:44:00) [4]

> накой шиш модальные окна-то ?
на кой модальные не понятно, а вот зачем окна... был где то вопрос про то, что браузер не строит "отображение" (и поэтому с него нельзя что то там получить) если его нет на форме... может связано? :)
хотя, добиться, от "того" партизана. подробностей, как повторить, тоже не удалось. т.что...


niro---   (2012-03-10 20:41:00) [5]


> Да, поторопился я, в справке сказано, что это событие может
> возникать ДО полной загрузки документа, когда ДОСТАТОЧНО
> данных для отображения. Но все равно, надо посмотреть на
> другие события, или даже на параметры в OnNavigateComplete2
> (возможно событие генерится не один раз), должен быть способ
> получить уведомление о загрузке.

Да там есть возможность решить проблему, нужно каждый раз смотреть что там загрузилось, делать выводы... вобщем приличный код городить. Я  
же пошел по пути наименьшего сопративления (как все в этом мире происходит), тот код, который я приводил выше, смотрится куда проще и элегантнее, только вот не предполагал, что так в потоках завязну...


>  Или взять TChromium. По-мне, так он удобнее, чем TWebBrowser.


Можно попробывать, но почти готовый проект на новые лыжи стаить...незнаю


Сергей М.   (2012-03-10 20:40:00) [6]


> niro---


я так и не понял - накой шиш модальные окна-то ?
да еще и туева хуча одновременно тобою создаваемых ?)


sniknik   (2012-03-10 20:40:00) [7]

> то о чем вы говорите это с серверной стороны
+1. смешались в кучу кони, люди... + приправлено банальщиной.

> в справке сказано, что это событие может возникать ДО полной загрузки документа
onDocumentComplete
???
зачем проверять навигейт?


DVM   (2012-03-10 20:30:00) [8]


> niro---   (10.03.12 20:22) [29]
>


>  OnNavigateComplete2 работать корректно не получилось...
>  

Да, поторопился я, в справке сказано, что это событие может возникать ДО полной загрузки документа, когда ДОСТАТОЧНО данных для отображения. Но все равно, надо посмотреть на другие события, или даже на параметры в OnNavigateComplete2 (возможно событие генерится не один раз), должен быть способ получить уведомление о загрузке. Или взять TChromium. По-мне, так он удобнее, чем TWebBrowser.


знайка   (2012-03-10 20:25:00) [9]


> еще как обрабатывают.
то о чем вы говорите это с серверной стороны, а ваша тема это - клиентская сторона, и тут динамические в смысле не перегружаемые или частично перегружаемые - ajax, silverlight, flash...


niro---   (2012-03-10 20:22:00) [10]


> Это один из возможных вариантов, когда изначально асинхронное
> намеренно пытаются сделать синхронным. У всех встраиваемых
> браузерных движков есть событие окончания загрузки, у TChromium
> - OnLoadEnd, у TWebBrowser - OnNavigateComplete2, у других
> тоже есть. Работа с ними асинхронна, зачем сначала ее делать
> синхронной, а потом героически преодолевать возникший эффект
> с помощью потоков?


Это вынужденая мера, заставить OnNavigateComplete2 работать корректно не получилось... это событие на некоторых страницах или не возникает, или возникает неоднократно...(


Cobalt   (2012-03-10 20:19:00) [11]

2 niro---
Ты, партизанен, давай так: рассказывай что в общем хочешь сделать, а не "считывать странички, заполнять формы", и будем танцевать от этого.


DVM   (2012-03-10 20:11:00) [12]


> niro---   (10.03.12 20:01) [26]


> К сожалению, если копнете по глуб же, то окажутся нужны,
>  взять хотя бы метод определения окончания загрузки станицы,
>  вот пример:
>
> Forma.WB1.Navigate(....);-загружаем страницу
>
> while WebBrowser.ReadyState<>4 do  //
>  begin                                          //
>  Application.ProcessMessages;         // ждем когда страница
> загрузится,
>  sleep(100);                                 // а если этих
> страниц 30, это где то
>  end;                                          // 3*30 секунд,
>  и это при ширине канала 20 мб
>
>

Это один из возможных вариантов, когда изначально асинхронное намеренно пытаются сделать синхронным. У всех встраиваемых браузерных движков есть событие окончания загрузки, у TChromium - OnLoadEnd, у TWebBrowser - OnNavigateComplete2, у других тоже есть. Работа с ними асинхронна, зачем сначала ее делать синхронной, а потом героически преодолевать возникший эффект с помощью потоков?


niro---   (2012-03-10 20:01:00) [13]


> кстати если начинать про "робо-пауков" то гугл, и еже с
> ними не обрабатывает динамически создаваемые страницы (ИМХО,
>  могу быть просто не в курсе), иначе им бы не потребовались
> специальные "робо-странички" формируемые веб мастерами.

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


> Теперь похоже на спамилку. Типа AllSubmitter.

к чему годать???


> Но методы TWebBrowser насколько я знаю, не блокирующие,
> т.е выполнение запроса и загрузка страницы не останавливают
> работу вызывающего потока. Т.е тут не нужны доп потоки.
>


К сожалению, если копнете по глуб же, то окажутся нужны, взять хотя бы метод определения окончания загрузки станицы, вот пример:

Forma.WB1.Navigate(....);-загружаем страницу

while WebBrowser.ReadyState<>4 do  //
 begin                                          //
 Application.ProcessMessages;         // ждем когда страница загрузится,
 sleep(100);                                 // а если этих страниц 30, это где то
 end;                                          // 3*30 секунд, и это при ширине канала 20 мб

далее делаем что то со страницей...


> а вот со скриптами и проч. можно(нужно) и без него.


Уже бы и рад без него, но вариантов пока не вижу, может дадите ссылку на информацию.


DVM   (2012-03-10 19:28:00) [14]


> sniknik ©   (10.03.12 19:19) [21]


> кстати если начинать про "робо-пауков" то гугл, и еже с
> ними не обрабатывает динамически создаваемые страницы (ИМХО,
>  могу быть просто не в курсе)

постепенно поисковики уже научились обрабатывать и такие страницы. Более того научились кликать там где нет ссылки, но кликать можно (флеш, JavScript-Ajax всякий т.к. таких сайтов все больше). Не идеально конечно, но это у них уже есть.


DVM   (2012-03-10 19:24:00) [15]


> niro---   (10.03.12 19:03) [19]


> Совершенно верно - что то на вроде паука. Без TWebBrowser-
> а не обойтись, иногда придется заполнять формы, работать
> с JavaScript и flash.

Теперь похоже на спамилку. Типа AllSubmitter.

Ну хорошо, пусть нужен TWebBrowser. Но методы TWebBrowser насколько я знаю, не блокирующие, т.е выполнение запроса и загрузка страницы не останавливают работу вызывающего потока. Т.е тут не нужны доп потоки. Также непонятно зачем нужны модальные формы. Надо обычные формы взять, не модальные.


знайка   (2012-03-10 19:22:00) [16]


> Совершенно верно - что то на вроде паука. Без TWebBrowser-
> а не обойтись, иногда придется заполнять формы, работать
> с JavaScript и flash.
интересно и как TWebBrowser поможет вам с flash (silverlight)?
а вот со скриптами и проч. можно(нужно) и без него.


sniknik   (2012-03-10 19:21:00) [17]

пользуйся
http://help.yandex.ru/webmaster/?id=996567


sniknik   (2012-03-10 19:19:00) [18]

кстати если начинать про "робо-пауков" то гугл, и еже с ними не обрабатывает динамически создаваемые страницы (ИМХО, могу быть просто не в курсе), иначе им бы не потребовались специальные "робо-странички" формируемые веб мастерами.


sniknik   (2012-03-10 19:14:00) [19]

> но существуют и диаметрально противоположные мнения.
какие такие мнения? в справке написано - 2 vcl не потокобезопасен.


niro---   (2012-03-10 19:03:00) [20]


> Это робот-паук что ли? По описанию похоже. Если да, то TWebBrowser
> может и не нужен совсем. За исключением страниц на которых
> все формируется динамически JavaScript - ами

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


> Визуальные компоненты с многопоточностью вообще не совместимы


Многие об этом говорят, но существуют и диаметрально противоположные мнения.


> Нужно ли вообще "до сотни" потоков? Канал-то всё равно один,
>  ну может что-то и выиграешь за счёт более "плотного" его
> использования при загрузке мелких файлов, и то не факт.


100 от фанаря сказал, количество от ширины канала, и конкретной задачи динамически определяется.


Страницы:   1 2

Наверх

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