Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как создать TWebBrowser в ран-тайм? [D6, Win2k]


bloodman ©   (2004-11-14 17:58:00) 

Мне нужно в отдельном потоке создать экземпляр 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 ...


Defunct   (2004-11-15 01:05:00) [1]

2 Игорь

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

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

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


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

2 Piter

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

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


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

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

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

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

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

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


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

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


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


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

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


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


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

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


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


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

2 [9] Defunct

Я рад за вас.


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

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

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


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

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


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

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

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

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

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


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

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


Ihor Osov'yak   (2004-11-14 23:46:00) [12]

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

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

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


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

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


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

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 ..


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

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


Anatoly Podgoretsky   (2004-11-14 18:17:00) [16]

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо