Autor Beitrag
endeffects
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 41



BeitragVerfasst: Di 17.08.04 19:29 
Hallo,

ich hab leider ein Problem den TWebbrowser in Threads fehlerfrei nutzen zu können.
Vielleicht kann mir ja Jemand hier dabei helfen. Zur Zeit gibt es dabei 2 gravierende
Probleme. Zum einen wird die Warteschleife bis das Dokument fertig geladen wird
oftmals nicht verlassen und zweitens bekomm ich eine Zugriffverletzung wenn
ich auf Elemente der Webseite Einfluss nehmen möchte (OleObject).

Mein Code schaut zur Zeit wie folgt aus:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
MainUnit
//hier werden die Threads erzeugt
********************************************************
for Loop := 0 to length(ThreadArray) - 1 do
  begin
    ThreadArray[Loop] := TMyThreads.Create(true);
    ThreadArray[Loop].app := Application;
...
********************************************************


ThreadUnit:
//Der TWebbrowser wird zur Laufzeit erstellt und ein request gesendet
********************************************************
type
  TMyThreads = class(TThread)
public
    app : TApplication;

procedure TMyThreads.Execute;
var  WebBrowser: TWebBrowser;
begin
  OleInitialize(nil);
  WebBrowser:= TWebBrowser.Create(nil);
  with WebBrowser do
    try
      OnDocumentComplete:= Self.Submit;
      Navigate('http://www.google.com');

    while WebBrowser.ReadyState <> READYSTATE_COMPLETE do
      app.ProcessMessages;

    except
      FreeAndNil(WebBrowser);
      OleUninitialize;
    end;
end;

procedure TMyThreads.Submit(Sender: TObject; const pDisp: IDispatch; var
URL: OleVariant);
begin

  (Sender As
TWebBrowser).OleObject.document.forms.item(0).elements.item('q').value:='tes
t'
;
  (Sender As TWebBrowser).OleObject.Document.Forms.item(0).submit;
  FreeAndNil(Sender);
  OleUninitialize;
end;
********************************************************


Kann mir vielleicht Jemand weiterhelfen?
Martin W
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 116



BeitragVerfasst: Mi 18.08.04 17:38 
Zitat:
Zum einen wird die Warteschleife bis das Dokument fertig geladen wird
oftmals nicht verlassen


Warteschleife? Was meinst du damit?


Zitat:
und zweitens bekomm ich eine Zugriffverletzung wenn ich auf Elemente der Webseite Einfluss nehmen möchte (OleObject).


Probiere es mal mit Synchronize();


Zitat:
Mein Code schaut zur Zeit wie folgt aus:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
MainUnit
//hier werden die Threads erzeugt
********************************************************
for Loop := 0 to length(ThreadArray) - 1 do
  begin
    ThreadArray[Loop] := TMyThreads.Create(true);
    ThreadArray[Loop].app := Application;
...
********************************************************


Das macht man übrigens nicht so, sondern so:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
ThreadArray[Loop] := TMyThreads.Create(True);
ThreadArray[Loop].Priority := tpIdle;
ThreadArray[Loop].FreeOnTerminate := True;
// Variablen übergeben
ThreadArray[Loop].app := Application;
// Und reaktivieren
ThreadArray[Loop].Resume;



Zitat:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
ThreadUnit:
//Der TWebbrowser wird zur Laufzeit erstellt und ein request gesendet
********************************************************
type
  TMyThreads = class(TThread)
public
    app : TApplication;

procedure TMyThreads.Execute;
var  WebBrowser: TWebBrowser;
begin
  OleInitialize(nil);
  WebBrowser:= TWebBrowser.Create(nil);
  with WebBrowser do
    try
      OnDocumentComplete:= Self.Submit;
      Navigate('http://www.google.com');

    while WebBrowser.ReadyState <> READYSTATE_COMPLETE do
      app.ProcessMessages;

    except
      FreeAndNil(WebBrowser);
      OleUninitialize;
    end;
end;


Auf das Synchronize() achten... Alleine das app.ProcessMessages sollte man schon damit aufrufen...

Übrigens führt dieser Code glaube ich zwangsläufig zu einem Fehler, wenn ich mich nicht täusche!

Warum erstellst du Komponente eigentlich erst im Thread?

mfg
Martin W.

---
Sollte ich was falsches geschrieben haben, korregiere mich bitte!