Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   TWebBrowser и поток? (https://forum.antichat.xyz/showthread.php?t=103186)

ZirroCool 26.01.2009 17:41

TWebBrowser и поток?
 
Проблема такая, код приведенный ниже делаю без потока, и все работает нормально за исключением подвисания формы, как только делаю поток (код см ниже) при запуске программы выдает
Цитата:

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


Время: 02:27