![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Заставить работать TWebBrowser в потоке из DLL [D7, XP]
niro--- © (2012-03-10 12:25:00)Что хотим получить:
В проекте имеется:
(1) Программа (exe)
(2) dll библиотека, создающая поток, и в потоке создающая форму с TWebBrowser-ом на ней.
Программа определяет сколько потоков ей необходимо и столько раз вызывает из DLL экспортируюмую фунцию, которая создает поток. Каждый поток, как я уже отмечал выше, создает модальную форму с TWebBrowser-ом на ней, за тем каждый поток в своем TWebBrowser-e загружает страницу из интернета (для каждого экземпляра своя), происходит переход по определенной ссылке на загруженой странице и сохранение последней страницы в один общий для всех потоков файл через критическую секцию.
Суть проблемы:
Потоки запусаются, окна создаются, TWebBrowser-ы так же создаются, и навигация на первоначальню страницу для каждего экземпляра происходит правильно, но переход по ссылке на загруженой странице происходит не в каждом окне каждого потока, а в последнем запущеном по поряку модальном окне, т.е. такое ощущение, что все потоки работают с последним по счету запущенным экземпляром TWebBrawser-ом, а не каждый со своим... Почему так происходит???
DVM (2012-03-10 18:40:00) [21]
> niro--- (10.03.12 12:25)
> создает модальную форму с TWebBrowser-ом на ней, за тем
> каждый поток в своем TWebBrowser-e загружает страницу из
> интернета (для каждого экземпляра своя),
Это робот-паук что ли? По описанию похоже. Если да, то TWebBrowser может и не нужен совсем. За исключением страниц на которых все формируется динамически JavaScript - ами
Sapersky (2012-03-10 18:21:00) [22]Изначально - да, всё плохо. Видимо, он просто не в курсе, что есть что-то кроме TWebBrowser (а многопоточность и dll - это вааще круто, надо вмонстрячить!). Увидел удобный компонент, уцепился за него, и пытается решать через него все задачи. Я сам 10 лет назад делал графический редактор на DrawGrid (одна ячейка - пиксель).
А вы, как вижу, если такими вещами и занимались, то никак не позже палеозоя, кайнозоя в крайнем случае. Конечно, за такое время можно и забыть :)
хотя работать если есть скрипты формирующие содержимое (предположительно нужное) не будет.
Да, я об этом предупредил.
Что тут можно сделать - не знаю, я не специалист по сетям. Может быть, задействовать IE невизуально, без TWebBrowser, или какие-то сторонние web-движки (от firefox, chrome) попробовать.
Возможно, есть ещё какие-то, более простые варианты - но понятно, что никто из местных гуру не выдаст сокровенного знания.
sniknik (2012-03-10 17:23:00) [23]> А что плохого в том, чтобы сказать, как сделать
потому, что вопрос изначально бредовый, без описания "что", для того чтобы было "как", а только теоретизирование о сделанном (еще вопрос), про которое можно сказать только что нельзя делать, но не как.
а нельзя практически все.
1 в dll не рекомендуют делать формы vcl.
2 vcl не потокобезопасен.
3 модальные окна не предназначены для "многопотоковости", даже если забыть о пункте 2.
4 и т.д. но мелочи можно опустить.
фактически "вопрос" это набор "умных слов" (ну вот к чему тут "критические секции"?).
и вот "как" делать набор умных слов???
> Как сделать:
ну, ну. попытайся. хотя работать если есть скрипты формирующие содержимое (предположительно нужное) не будет.
Sapersky (2012-03-10 17:04:00) [24]А что плохого в том, чтобы сказать, как сделать (не захочет - ССЗБ)? Впрочем, понимаю, некоторые из местных "лео кагановых" ушиблены на голову не хуже пресловутого ТЮзера, только объект ненависти другой.
Как сделать:
Страницы можно (и лучше) грузить невизуальными библиотеками вроде Synapse/Indy. Получишь текстовый файл/TStringList с кодом страницы, найти в нём нужную ссылку несложно.
Правда, я точно не знаю, насколько хорошо это работает с навороченными сайтами, обвешанными скриптами, флешами и прочей фигнёй. Ну попробуй отключить все эти фишки в браузере, загрузить страницу, сохранить её как html, открыть текстовым редактором и поискать нужную ссылку.
Визуальные компоненты с многопоточностью вообще не совместимы (AFAIK).
Нужно ли вообще "до сотни" потоков? Канал-то всё равно один, ну может что-то и выиграешь за счёт более "плотного" его использования при загрузке мелких файлов, и то не факт. Для начала лучше всё отладить в одном потоке.
DLL точно не нужна, про это уже написали.
sniknik (2012-03-10 16:45:00) [25]> или один под разными никами
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1331209343&n=18
по стилю, не удивлюсь, если один и тот же чел.
sniknik (2012-03-10 16:44:00) [26]> всем сразу стало понятно что и как ты там "вызываешь")
"программист теоретик", полно таких в последнее время (или один под разными никами).
характеризуется общими описаниями с уклоном в проблемы "компонент"/системы/обьектов и т.д. свой код принципиально скрыт, т.к. не любит наездов на свою не компетентность, и требует от других "ответить на вопрос, не зачем, а как...". т.е. плевать, что все им написанное укладывается в схему маниакального психоза, вас не анализировать просят, а сказать как сделать...
sniknik (2012-03-10 16:38:00) [27]> в этом судя по всему и кроется причина того, что все потоки начинают работать с последним запущенным ВебБраузером.
причина судя по всему в кривых руках, и отсутствии знаний... а вовсе не в одном загруженном экземпляре dll. вот с чего одному экземпляру нельзя создать несколько потоков? бред.
> о существовании потоков и всяких там ДЛЛ я узнал лишь несколько дней назад )
и ну давай их во все места себе пихать... а по идее должен подумать о целесообразности, этих всех "потоков и всяких там ДЛЛ".
Сергей М. (2012-03-10 16:30:00) [28]
> в памяти создается только один экземпляр того, что я вызываю
Потрясающее открытие)
И ведь что характерно - всем сразу стало понятно что и как ты там "вызываешь")
Сергей М. (2012-03-10 16:28:00) [29]С точностью до наоборот: что и как не работает)
niro--- (2012-03-10 16:26:00) [30]Ну вот, сам кое что нарыл, вектор моих размышлений сейчас направлен в стоону особенностей DLL, если я правильно понимаю, сколько бы раз я не вызывал, функцию из ДЛЛ-ки, в памяти создается только один экземпляр того, что я вызываю, в этом судя по всему и кроется причина того, что все потоки начинают работать с последним запущенным ВебБраузером.
Мои догадки подтвердились, когда я зделал 2 ДЛЛ, для каждого потока свою ДЛЛ, все заработало, как мне было нужно, но как зделать все в одной ДЛЛ, потоков у меня может быть до сотни? :(
Прошу не пинать за делитанские рассуждения, о существовании потоков и всяких там ДЛЛ я узнал лишь несколько дней назад )
niro--- (2012-03-10 15:38:00) [31]
> Но при этом тебе самому не кажется странным твой вопрос
> "Почему так происходит" ?)
Но какие то представления о том, что и как работает у меня уже есть )
Сергей М. (2012-03-10 15:27:00) [32]
> я вобще далек от программирования
Но при этом тебе самому не кажется странным твой вопрос "Почему так происходит" ?)
niro--- (2012-03-10 15:22:00) [33]
> Скажи, вьюнош, нафига тебе потоки с модальными формами?Ты
> хоть понимаешь, что значит "модальная форма"
Ну представление имею, я вобще далек от программирования, но вот приспичило сваять оду вещь.
P/S кстати, переход по ссылке реализован не в виде имитации щелчка мыши, а методом Forma.WB1.Navigate(url);
Cobalt (2012-03-10 14:48:00) [34]Каждый поток ... создает модальную форму
Скажи, вьюнош, нафига тебе потоки с модальными формами?
Ты хоть понимаешь, что значит " модальная форма"
niro--- (2012-03-10 14:39:00) [35]
> VCL нужно убрать, при такой "логике". вообще.
И как тогда быть без VCL??? каким образом реализовать в dll поток, который бы создавал фору с TWebBrowser-ом, и осуществлял навигацию в нем???
> зачем тут формы, зачем браузеры.. непонятно
Тут необходимо ответить на вопрос не зачем, а как...
знайка (2012-03-10 14:27:00) [36]зачем тут формы, зачем браузеры.. непонятно
sniknik (2012-03-10 14:15:00) [37]VCL нужно убрать, при такой "логике". вообще.
Сергей М. (2012-03-10 14:02:00) [38]потому что ошибка в программе.