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

Вниз

Как создать TWebBrowser в ран-тайм?   Найти похожие ветки 

 
bloodman ©   (2004-11-14 17:58) [0]

Мне нужно в отдельном потоке создать экземпляр TWebBrowser , Делаю так :
TMyThread = class(TThread)
   protected
     procedure Execute; override;

    private
       State : integer;
       WBS : array[0..255] of TWebBrowser;
       URL : String;
       ProgBar : TProgressBar;
       Constructor Create(CreateSuspennded: Boolean;URL1 : String;Pb:TProgressBar);
       procedure OnNav(Sender: TObject; const pDisp: IDispatch; var URL: OleVariant);
       procedure OnNav2(Sender: TObject; const pDisp: IDispatch; var URL: OleVariant);
  end;

....

procedure TMyThread.Execute;
var
 wb : TWebBrowser;
begin
 wb:=nil;
 wb:=TWebBrowser.Create(nil);  вот на этой строчке вылетает ошибка : CoInitialize has not been called.
 wb.OnNavigateComplete2:=OnNav;
end;

Как с ней справиться?  Вставлял CoInitialize(wb) говорит Undeclared Identifier ...


 
Anatoly Podgoretsky ©   (2004-11-14 18:17) [1]

Ну так как и написано, то есть call
А uses правильно оформил?


 
Sergey_Masloff   (2004-11-14 18:46) [2]

CoInitialize нужно вызывать в каждом потоке (кроме главного потока VCL приложения в котором есть uses ComObj).
Так что CoInitialize(nil) в начало треда и все. Ну и CoUnitialize в конце не забыть


 
bloodman ©   (2004-11-14 20:44) [3]

Anatoly Podgoretsky ©   (14.11.04 18:17) [1]
описание типа потока у меня в главном юните у него uses такой :
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, OleCtrls, SHDocVw, StdCtrls, ComCtrls, Grids, swStringGrid,ComObj;

Sergey_Masloff   (14.11.04 18:46) [2]
У меня Компилятор на эту строчку ругается что Undeclared Identifier  CoInitialize ..


 
Shaman_Naydak   (2004-11-14 22:19) [4]

Подключи ActiveX,  чтобы не ругался


 
Ihor Osov'yak ©   (2004-11-14 23:46) [5]

в отдельном потоке  TWebBrowser - есть несколько моментов.
Часть уже упомянули -  CoInitialize/CoInitialize..

Вторая - для нормальной работы соотв. активХ (а TWebBrowser всего лишь оболочка над єтим активХ) - нужен цыкл выборки сообщений в потоке. В принцыпе, это легко реализуемо. Но, кажется, есть более существенная проблема. Это TOleControl - наследником которого есть TWebBrowser. TOleControl как большинство визуальных vcl-компонентов не расчитан на работу в потоках, отличніх от главного потока приложения. Подозреваю, что в связи с єтим будет очень много ньюансов, которіе решаются нетривиально, если вообще решаются. Тем более, что, по моему скромному мнению - использовать TWebBrowser в дополнительных потоках нет абсолютно никакого смысла.  Это связано с тем - что TWebBrowser по существу своему вещь, работаюшая ассинхронно - то есть мы можем создать несколько соотв.понент, дать им задания, и они будут "паралельно"  выполнять свою работу.. Понятно, они созадут несколько своих, и не подочетных нам потоков, но с нашей точки зрения TWebBrowser будет работать асинхронно. Естественно, если мы им не помешаем.  Условие "не мешания" довольно простое - не останавливать главный поток приложения. Поэтому всякие sleep для ожидания и "синхронизаций" в главном vcl-потоке категорично неприветсвуются, и рано или позно приводят к тем или иным проблемам в функционировании TWebBrowser

Конечно, может быть у Вас ситуация, когда нужно максимальная производительность с целью обеспечения какой-то функциональности. Тогда есть смысл проработать вариант работы с mshtml напрямую, совсем без визуализации. Сам mshtml прекоасно работает в потоках, и обеспечивает практиіески всю функциональность TWebBrowser, а также ряд дополнительных моментов, недоступных при работе на более высоком уровне (TWeBBrowser).
Конечно, вариант "mshtml + UI-less" несколько более трудоемок, но я подозреваю, что это все-же будет не так сложно, чем пропихивание не рекомендуемого к пропихиванию (TWebBrowser в отдельном потоке). Ну, и само-собою, намного менее требовательнее к ресурсам и значительно производительное решение по сравнению с несколькими TWebBrowser  асинхронно, либо в потоках (последнее - я все же придерживаюсь мнения, что стабильного и качественого решения не существует)


 
Ihor Osov'yak ©   (2004-11-14 23:50) [6]

прошу извинить за опечатки.. что-то торопился не по делу..


 
Defunct ©   (2004-11-15 00:12) [7]

> CoInitialize/CoInitialize..
> соотв.понент
> (последнее - я все же придерживаюсь мнения, что стабильного и качественого решения не существует)

> прошу извинить за опечатки..

мягко сказано.
это уже не опечатки, а просто бессмыслица.

(не подумайте, что это из-за личной неприязни. Вначале вы советуете перенести все в основной поток, потом говорите надо работать без визуализации и в конце пишете, что стабильного решения нет).


 
Ihor Osov'yak ©   (2004-11-15 00:19) [8]

Я уже одному человеку советовал учиться внимательно читать.
Для не умеющих внимательно читать - повторяю медленно - рассматривалось три варианта. Первый  WB в основном потоке и работают, как по уставу положено - в асинхронном режиме. Второй вариант - если на первом месте производительность и визуализация не нужна - ui-less mshtml в многопотчном варианте. Третий вариант - крайне нежелетельный - попітка заставить работать TWB в потоках, отличных от главного vcl-cкого потока.


 
Defunct ©   (2004-11-15 00:23) [9]

Ihor Osov"yak ©   (15.11.04 00:19) [8]

Спасибо, теперь все понятно.


 
Ihor Osov'yak ©   (2004-11-15 00:25) [10]

2 [9] Defunct

Я рад за вас.


 
Piter ©   (2004-11-15 00:38) [11]

Ihor Osov"yak ©   (15.11.04 0:19) [8]
Я уже одному человеку советовал учиться внимательно читать


Да я внимательно читаю...


 
Piter ©   (2004-11-15 00:39) [12]

Sergey_Masloff   (14.11.04 18:46) [2]
CoInitialize нужно вызывать в каждом потоке (кроме главного потока VCL приложения в котором есть uses ComObj).


а нафига нужен этот CoInitialize?


 
Piter ©   (2004-11-15 00:39) [13]

Ihor Osov"yak ©   (15.11.04 0:25) [10]
Я рад за вас.


сильно сомневаюсь :)


 
Ihor Osov'yak ©   (2004-11-15 00:43) [14]

2 [11] Piter ©   (15.11.04 00:38)
в контексте этого разговара я не Piter © имел ввиду. Или шапка загорелась?

> а нафига нужен этот CoInitialize?

В соответствии с парадигмой COM.

> сильно сомневаюсь :)

если кажется - крестится нужно. Довольно часто помогает.


 
Defunct ©   (2004-11-15 00:54) [15]

2 Piter

Зачем наколять обстановку, тем более Игорь извинился за опечатки и доступно все пояснил в [8]. Причем, большое спасибо ему, за то он поделился опытом, и я например, теперь не буду тратить лишнее время на реализацию TWB в отдельных потоках, если вдруг когда-нибудь столкнусь с подобной задачей.

То что он там написал про умение читать, относилось только ко мне, и я нисколько не обижаюсь.


 
Defunct ©   (2004-11-15 01:05) [16]

2 Игорь

Давайте будем более вежливыми друг к другу и ко всем остальным.

Вежливость - это язык, который слышит глухой и видит слепой (C)

Жестокие слова не ломают кости, но ранят сердце (C)



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

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

Наверх




Память: 0.51 MB
Время: 0.036 c
6-1095475793
Настенька
2004-09-18 06:49
2004.11.28
Помогите с IdHTTP !


1-1100628428
Змей
2004-11-16 21:07
2004.11.28
Form>bolderstyle


14-1100140195
VuDZ
2004-11-11 05:29
2004.11.28
Я вернулся


1-1100597911
Vaitek
2004-11-16 12:38
2004.11.28
Директивы компелятора.


3-1099047904
Lamo
2004-10-29 15:05
2004.11.28
EhLib: DBGrigEh.EditButtons.OnClick - Sender ?