Форум: "Основная";
Текущий архив: 2004.11.28;
Скачать: [xml.tar.bz2];
ВнизКак создать 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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.031 c