![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Заставить работать TWebBrowser в потоке из DLL [D7, XP]
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 от фанаря сказал, количество от ширины канала, и конкретной задачи динамически определяется.