Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.03.22;
Скачать: CL | DM;

Вниз

Заставить работать TWebBrowser в потоке из DLL   Найти похожие ветки 

 
niro---   (2012-03-10 12:25) [0]

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

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

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

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

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

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


 
Сергей М. ©   (2012-03-10 14:02) [1]

потому что ошибка в программе.


 
sniknik ©   (2012-03-10 14:15) [2]

VCL нужно убрать, при такой "логике". вообще.


 
знайка   (2012-03-10 14:27) [3]

зачем тут формы, зачем браузеры.. непонятно


 
niro---   (2012-03-10 14:39) [4]


> VCL нужно убрать, при такой "логике". вообще.

И как тогда быть без VCL???  каким образом реализовать в dll поток, который бы создавал фору с TWebBrowser-ом, и осуществлял навигацию в нем???


> зачем тут формы, зачем браузеры.. непонятно

Тут необходимо ответить на вопрос не зачем, а как...


 
Cobalt ©   (2012-03-10 14:48) [5]

Каждый поток ... создает модальную форму

Скажи, вьюнош, нафига тебе потоки с модальными формами?
Ты хоть понимаешь, что значит "модальная форма"


 
niro---   (2012-03-10 15:22) [6]


> Скажи, вьюнош, нафига тебе потоки с модальными формами?Ты
> хоть понимаешь, что значит "модальная форма"

Ну представление имею, я вобще далек от программирования, но вот приспичило сваять оду вещь.

P/S кстати, переход по ссылке реализован не в виде имитации щелчка мыши, а методом Forma.WB1.Navigate(url);


 
Сергей М. ©   (2012-03-10 15:27) [7]


> я вобще далек от программирования


Но при этом тебе самому не кажется странным твой вопрос "Почему так происходит" ?)


 
niro---   (2012-03-10 15:38) [8]


> Но при этом тебе самому не кажется странным твой вопрос
> "Почему так происходит" ?)

Но какие то представления о том, что и как работает у меня уже есть )


 
niro---   (2012-03-10 16:26) [9]

Ну вот, сам кое что нарыл, вектор моих размышлений сейчас направлен в стоону особенностей DLL, если я правильно понимаю, сколько бы раз я не вызывал, функцию из ДЛЛ-ки, в памяти создается только один экземпляр того, что я вызываю, в этом судя по всему и кроется причина того, что все потоки начинают работать с последним запущенным ВебБраузером.

Мои догадки подтвердились, когда я зделал 2 ДЛЛ, для каждого потока свою ДЛЛ, все заработало, как мне было нужно, но как зделать все в одной ДЛЛ, потоков у меня может быть до сотни? :(

Прошу не пинать за делитанские рассуждения, о существовании потоков и всяких там ДЛЛ я узнал лишь несколько дней назад )


 
Сергей М. ©   (2012-03-10 16:28) [10]

С точностью до наоборот: что и как не  работает)


 
Сергей М. ©   (2012-03-10 16:30) [11]


> в памяти создается только один экземпляр того, что я вызываю


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


 
sniknik ©   (2012-03-10 16:38) [12]

> в этом судя по всему и кроется причина того, что все потоки начинают работать с последним запущенным ВебБраузером.
причина судя по всему в кривых руках, и отсутствии знаний... а вовсе не в одном загруженном экземпляре dll. вот с чего одному экземпляру нельзя создать несколько потоков? бред.

> о существовании потоков и всяких там ДЛЛ я узнал лишь несколько дней назад )
и ну давай их во все места себе пихать... а по идее должен подумать о целесообразности, этих всех "потоков и всяких там ДЛЛ".


 
sniknik ©   (2012-03-10 16:44) [13]

> всем сразу стало понятно что и как ты там "вызываешь")
"программист теоретик", полно таких в последнее время (или один под разными никами).
характеризуется общими описаниями с уклоном в проблемы "компонент"/системы/обьектов и т.д. свой код принципиально скрыт, т.к. не любит наездов на свою не компетентность, и требует от других "ответить на вопрос, не зачем, а как...". т.е. плевать, что все им написанное укладывается в схему маниакального психоза, вас не анализировать просят, а сказать как сделать...


 
sniknik ©   (2012-03-10 16:45) [14]

> или один под разными никами
http://delphimaster.net/view/2-1331209343/
по стилю, не удивлюсь, если один и тот же чел.


 
Sapersky   (2012-03-10 17:04) [15]

А что плохого в том, чтобы сказать, как сделать (не захочет - ССЗБ)? Впрочем, понимаю, некоторые из местных "лео кагановых" ушиблены на голову не хуже пресловутого ТЮзера, только объект ненависти другой.

Как сделать:

Страницы можно (и лучше) грузить невизуальными библиотеками вроде Synapse/Indy. Получишь текстовый файл/TStringList с кодом страницы, найти в нём нужную ссылку несложно.
Правда, я точно не знаю, насколько хорошо это работает с навороченными сайтами, обвешанными скриптами, флешами и прочей фигнёй. Ну попробуй отключить все эти фишки в браузере, загрузить страницу, сохранить её как html, открыть текстовым редактором и поискать нужную ссылку.

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

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


 
sniknik ©   (2012-03-10 17:23) [16]

> А что плохого в том, чтобы сказать, как сделать
потому, что вопрос изначально бредовый, без описания "что", для того чтобы было "как", а только теоретизирование о сделанном (еще вопрос), про которое можно сказать только что нельзя делать, но не как.
а нельзя практически все.
1 в dll не рекомендуют делать формы vcl.
2 vcl не потокобезопасен.
3 модальные окна не предназначены для "многопотоковости", даже если забыть о пункте 2.
4 и т.д. но мелочи можно опустить.
фактически "вопрос" это набор "умных слов" (ну вот к чему тут "критические секции"?).
и вот "как" делать набор умных слов???

> Как сделать:
ну, ну. попытайся. хотя работать если есть скрипты формирующие содержимое (предположительно нужное) не будет.


 
Sapersky   (2012-03-10 18:21) [17]

Изначально - да, всё плохо. Видимо, он просто не в курсе, что есть что-то кроме TWebBrowser (а многопоточность и dll - это вааще круто, надо вмонстрячить!). Увидел удобный компонент, уцепился за него, и пытается решать через него все задачи. Я сам 10 лет назад делал графический редактор на DrawGrid (одна ячейка - пиксель).
А вы, как вижу, если такими вещами и занимались, то никак не позже палеозоя, кайнозоя в крайнем случае. Конечно, за такое время можно и забыть :)

хотя работать если есть скрипты формирующие содержимое (предположительно нужное) не будет.

Да, я об этом предупредил.
Что тут можно сделать - не знаю, я не специалист по сетям. Может быть, задействовать IE невизуально, без TWebBrowser, или какие-то сторонние web-движки (от firefox, chrome) попробовать.
Возможно, есть ещё какие-то, более простые варианты - но понятно, что никто из местных гуру не выдаст сокровенного знания.


 
DVM ©   (2012-03-10 18:40) [18]


> niro---   (10.03.12 12:25) 


> создает модальную форму с TWebBrowser-ом на ней, за тем
> каждый поток в своем TWebBrowser-e загружает страницу из
> интернета (для каждого экземпляра своя),

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


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


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

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


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


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


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


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


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

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


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

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


 
sniknik ©   (2012-03-10 19:21) [22]

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


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


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


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


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


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

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

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


 
DVM ©   (2012-03-10 19:28) [25]


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


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

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


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


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

еще как обрабатывают.
строго говоря из "динамически создаваемых страниц" большая часть интернета состоит, современный сайт - РНР движек, выдающи динамически сформированую 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 20:11) [27]


> 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, у других тоже есть. Работа с ними асинхронна, зачем сначала ее делать синхронной, а потом героически преодолевать возникший эффект с помощью потоков?


 
Cobalt ©   (2012-03-10 20:19) [28]

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


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


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


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


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


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


 
DVM ©   (2012-03-10 20:30) [31]


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


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

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


 
sniknik ©   (2012-03-10 20:40) [32]

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

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


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


> niro---


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


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


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

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


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


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


 
sniknik ©   (2012-03-10 20:44) [35]

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


 
Inovet ©   (2012-03-10 20:49) [36]

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

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


 
DVM ©   (2012-03-10 20:53) [37]


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

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


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


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


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


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

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

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



Страницы: 1 вся ветка

Текущий архив: 2013.03.22;
Скачать: CL | DM;

Наверх




Память: 0.59 MB
Время: 0.062 c
15-1330005162
Artem
2012-02-23 17:52
2013.03.22
Посоветуйте программу-терминал...


15-1343668211
vasa777
2012-07-30 21:10
2013.03.22
дельфи устарело


2-1334691033
Новичок
2012-04-17 23:30
2013.03.22
Сканер штрих-кодов


15-1347455469
Artem
2012-09-12 17:11
2013.03.22
Как включить отображение 3d визуализации?


15-1346782032
vuk
2012-09-04 22:07
2013.03.22
Плавали по морю мимо Кольского