Форум: "Начинающим";
Текущий архив: 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.57 MB
Время: 0.073 c