PDA

Просмотр полной версии : TWebBrowser и поток?


ZirroCool
26.01.2009, 17:41
Проблема такая, код приведенный ниже делаю без потока, и все работает нормально за исключением подвисания формы, как только делаю поток (код см ниже) при запуске программы выдает
raiset exception class EAccess Violation with message 'Access violation at address 43D086F6 with module mshtml.dll Process stoped....'
я понял что трабл в этой части кода
HtmlDocument := form1.WebBrowser1.Document as IHtmlDocument2;
HtmlCollection := HtmlDocument.All;
for I := 0 to HtmlCollection.Length - 1 do
begin
HtmlElement := HtmlCollection.Item(i, 0) as IHtmlElement;
allstr :=allstr+' '+HtmlElement.outerHTML;

Подскажите кто нибудь в чем может быть проблема и как ее исправить!



unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, OleCtrls, SHDocVw, StdCtrls,ActiveX,MSHTML, ExtCtrls, ComCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
WebBrowser1: TWebBrowser;
Memo1: TMemo;
Button2: TButton;
Timer1: TTimer;
StatusBar1: TStatusBar;
procedure FormCreate(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
////////////обьявляю поток
tnew = class(tthread)
private
protected
IE:TInternetExplorer;
procedure execute; override;
end;
///////////////
var
Form1: TForm1;
xvatit:integer;
new: tnew;
implementation

{$R *.dfm}
procedure tnew.execute;
var
HtmlDocument: IHtmlDocument2;
HtmlCollection: IHtmlElementCollection;
HtmlElement: IHtmlElement;
I: Integer;
opnum:integer;
allstr:WideString;
begin
form1.Button1.Enabled:=false;
xvatit:=0;
{for z:=0 to 2147483500 do
begin
if xvatit = 1 then
begin
xvatit := 0;
exit;
end;}
repeat
HtmlDocument := form1.WebBrowser1.Document as IHtmlDocument2;
HtmlCollection := HtmlDocument.All;
for I := 0 to HtmlCollection.Length - 1 do
begin
HtmlElement := HtmlCollection.Item(i, 0) as IHtmlElement;
allstr :=allstr+' '+HtmlElement.outerHTML;
end;
//form1.Update;
//Application.ProcessMessages;
sleep(200);
opnum := pos('#ffffff"><B>op',allstr); //#f9b7ff
if opnum=0 then
else
begin
allstr := Copy(allstr, opnum+12,opnum+28);
opnum := pos('</B>',allstr);
allstr := Copy(allstr,1,opnum-1);
form1.Memo1.Lines.Add(allstr+' Был снят в:'+TimeToStr(now));
//Application.ProcessMessages;
sleep(200);

form1.WebBrowser1.Navigate('http://xxx.ru/index.html');
//Application.ProcessMessages;
sleep(200);
end;
//form1.Update;
allstr:='';
{end;}
until xvatit = 1;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
new := tnew.create(true);
new.freeonterminate := true;
new.priority := tpnormal;
new.resume;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
form1.WebBrowser1.Navigate('http://xxx.ru/index.html');
end;

Chaak
26.01.2009, 18:34
HtmlElement := HtmlCollection.Item(i, 0) as IHtmlElement;
Скорей всего здесь идет доступ к несуществующему элементу...

ZirroCool
26.01.2009, 18:46
Уже нашел решение, прям мистика какаято, ищу-ищу не могу найти, стоит запостить тут сразу нахожу то что нужно, проблема решилась следующим способом просто в потоке свою процу обьявить как метод и запускать с синхронизацией!
Сабж:http://www.interface.ru/home.asp?artId=6105

slesh
26.01.2009, 20:29
Я тоже сталкивался с этим, но в моём случае я сделал посылку сообщений форме типа wm_user+n и в обработчике этого сообщения уже брал из глобальной переменной адрес и грузил его.