TWebBrowser и поток?

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by ZirroCool, 26 Jan 2009.

  1. ZirroCool

    ZirroCool Elder - Старейшина

    Joined:
    16 Sep 2006
    Messages:
    128
    Likes Received:
    55
    Reputations:
    20
    Проблема такая, код приведенный ниже делаю без потока, и все работает нормально за исключением подвисания формы, как только делаю поток (код см ниже) при запуске программы выдает
    я понял что трабл в этой части кода
    Подскажите кто нибудь в чем может быть проблема и как ее исправить!

    Code:
    
    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;
    
     
  2. Chaak

    Chaak Elder - Старейшина

    Joined:
    1 Jun 2008
    Messages:
    1,059
    Likes Received:
    1,067
    Reputations:
    80
    Скорей всего здесь идет доступ к несуществующему элементу...
     
  3. ZirroCool

    ZirroCool Elder - Старейшина

    Joined:
    16 Sep 2006
    Messages:
    128
    Likes Received:
    55
    Reputations:
    20
    Уже нашел решение, прям мистика какаято, ищу-ищу не могу найти, стоит запостить тут сразу нахожу то что нужно, проблема решилась следующим способом просто в потоке свою процу обьявить как метод и запускать с синхронизацией!
    Сабж:http://www.interface.ru/home.asp?artId=6105
     
  4. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Я тоже сталкивался с этим, но в моём случае я сделал посылку сообщений форме типа wm_user+n и в обработчике этого сообщения уже брал из глобальной переменной адрес и грузил его.