Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Вниз

Заставить работать 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.58 MB
Время: 0.06 c
8-1227539352
sh1k4r1
2008-11-24 18:09
2013.03.22
Подкинули задачку


15-1352991636
AV
2012-11-15 19:00
2013.03.22
Четверговская задача :)


1-1302439218
Luarvic
2011-04-10 16:40
2013.03.22
Плагин Миранды в свое приложение


4-1261055064
Андрей Пл
2009-12-17 16:04
2013.03.22
Работа с СОМ портом, пакет AsyncPro406


15-1343766602
Юрий
2012-08-01 00:30
2013.03.22
С днем рождения ! 1 августа 2012 среда





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский