Toon posts:

[delphi 7] Thread werkt niet correct

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hi,

ik ben bezig met een thread die een pagina in HTML download, naar de hardeschijf. Voor de rest krijg ik geen compile errors. Ik heb de volgende handleiding gebruikt http://www.nldelphi.com/c...s.exe/ShowArticle?ID=7604. Ik heb het aangepast en het proggie draait, maar als ik dan de pagina op wil halen krijg ik de volgende error: EAbstractError

Hieronder mijn thread-code
Delphi:
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
unit Unit4;

interface

Uses
  Classes, IdHTTP;

Type
  TMyThread = Class( TThread )
  Private
    FResultStream: TStream;
  Protected
    Procedure Execute; Override;
  Public
    Property ResultStream: TStream read FResultStream  write FResultStream ;
  End;

Implementation

Procedure TMyThread.Execute;
Var
  IdHttp: TIdHttp;
  c: TComponent;
Begin
  IdHttp := TIdHttp.Create(c);
  Try
    IdHttp.Get('http://www.tweakers.net/', FResultStream);
  Finally
    IdHttp.Free;
  End;
End;


end.

en dit is mijn code die ik in het programma gebruik:
Delphi:
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
Procedure TfrmMain.OnThreadDone( Sender: Tobject );
Begin
  With ( Sender as TMyThread ) do
    begin
      ResultStream.Free;
    end;
End;

Procedure TfrmMain.GetPageAndSave;
Var
  MyThread: TMyThread;
  Stream: TFileStream;
Begin
  MyThread := TMyThread.Create( True );
  Stream := TFileStream.Create( 'c:\tweakers.html', fmCreate );
  With MyThread do
    Begin
      ResultStream := Stream;
      FreeOnTerminate := True;
      OnTerminate := OnThreadDone;
      Resume;
    end;
End;

procedure TfrmMain.Button2Click(Sender: TObject);
begin
  GetPageAndSave;
end;

Ziet iemand de fout die ik maak?

[ Voor 2% gewijzigd door curry684 op 19-10-2003 21:32 ]


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Even je [code]-tags omgevormd tot [code=delphi] :)

Op welke regel treedt die exception op?

Professionele website nodig?


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Bij het creeren van de TIdHTTP in je thread geef je als owner c mee. Dat doe je waarschijnlijk, omdat je geen component kan vinden die owner kan spelen.

C is alleen niet geinitializeerd en kan dus verwijzen naar een stuk geheugen waar niets staat. Initializeer c op nil of vergeet c en geef meteen nil mee. Zonder een owner werkt een component ook gewoon.

We adore chaos because we like to restore order - M.C. Escher


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

LordLarry schreef op 19 October 2003 @ 21:49:
Bij het creeren van de TIdHTTP in je thread geef je als owner c mee. Dat doe je waarschijnlijk, omdat je geen component kan vinden die owner kan spelen.

C is alleen niet geinitializeerd en kan dus verwijzen naar een stuk geheugen waar niets staat. Initializeer c op nil of vergeet c en geef meteen nil mee. Zonder een owner werkt een component ook gewoon.
Zonder Owner vernietigt alleen niemand hem automatisch. Je kunt dan beter het global Application object als owner meegeven.

Professionele website nodig?


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Idd, maar in zijn code staat een hele strakke try..finally :) Daar heb ik nog meer vertrouwen in dan de Owner structuur. Natuurlijk zou je het voor de zekerheid ooknog Application als owner meegeven. :) Wel een beetje zonde, want je bent dan meteen afhankelijk van de Forms unit die je misschien in je verdere app niet nodig hebt.

We adore chaos because we like to restore order - M.C. Escher