Autor Beitrag
momo_9376781
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Mo 17.12.12 09:45 
Hallo zusammen,

ich will den Quelltext einer Website auslesen. Dazu verwende ich die TIdHTTP Komponente.
Da das Auslesen mehrere Minuten dauern kann habe ich diese Funktion zum Auslesen des Quelltextes in ein
Thread geschrieben.
Um eine Rückmeldung zu haben sollte eine GIF Anmitation starten, wenn ich den Thread starte.
Dieses GIF friert aber trotz des Threads ein. Was mach ich falsch??
Hier noch ein wenig Quellcode:

Code im Thread
ausblenden Delphi-Quelltext
1:
2:
3:
...
res := IdHTTP1.Get('***************');
....


Aufruf des Threads
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
...
Image1.Enabled := True;
Image1.Visible := True;
Site := Thread_Read.Create;
res :=  Thread_Read.Start('Parameter1''Parameter2');
...
Nersgatt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: Mo 17.12.12 09:52 
Hallo und willkommen in der EE! :welcome:

Du rufst .Start von der Klasse (Thread_Read) auf, nicht von Deiner Klasseninstanz (site).
Du solltest Deine eigenen Klassen immer mit T beginnen lassen. Also ein besserer Name wäre somit TThread_Read. Das ist in der Delphiwelt allgemein Usus.

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
momo_9376781 Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Mo 17.12.12 09:59 
Hi,
Danke für die schnelle Antwort.

ausblenden Delphi-Quelltext
1:
2:
  Site := TThread_Read.Create;
  res :=  Site.Start('Parameter1''Parameter2');


Hab das jetzt so abgeändert. Das Problem bleibt aber immer noch gleich.. :-(
Oder hab ich was falsch verstanden?

Grüßle
Nersgatt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: Mo 17.12.12 10:01 
Poste mal bitte Deine komplette Threadklasse. Ich hab das Gefühl, dass Du die Startmethode nicht richtig überladen hast.

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
momo_9376781 Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Mo 17.12.12 10:05 
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:
unit UT_Site;

interface

uses
  System.Classes;

type
  TThread_Read = class(TThread)
  private
    { Private-Deklarationen }
  protected
    procedure Execute; override;
  public
    function Start(Parameter1, Parameter2 : String) : Stringvirtual;
  end;

implementation

{ TThread_Read }

procedure TThread_Read.Execute;
begin
  { Thread-Code hier einfügen }
end;

function TThread_Read.Start(Parameter1, Parameter2 : String) : String;
var
res : String;
begin

  try
    res := IdHTTP1.Get(Parameter1);
  finally
    Result := res;
  end;
end;

end.
Nersgatt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: Mo 17.12.12 10:19 
Ok, sowas hab ich mir gedacht. Du hast eine Function eingeführt, die Start heißt. Du musst aber die procedure .Execute überschreiben (diese wird von .Start aufgerufen). Änder das mal so ab:

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:
unit UT_Site;

interface

uses
  System.Classes;

type
  TThread_Read = class(TThread)
  private
    FParameter2: String;
    FParameter1: String;
    procedure SetParameter1(const Value: String);
    procedure SetParameter2(const Value: String);
    { Private-Deklarationen }
  protected
    procedure Execute; override;
  public
    property Parameter1 : String read FParameter1 write SetParameter1;
    property Parameter2 : String read FParameter2 write SetParameter2;
  end;

implementation

{ TThread_Read }


{ TThread_Read }

procedure TThread_Read.Execute;
begin
  inherited;

  IdHTTP1.Get(Parameter1);

end;

procedure TThread_Read.SetParameter1(const Value: String);
begin
  FParameter1 := Value;
end;

procedure TThread_Read.SetParameter2(const Value: String);
begin
  FParameter2 := Value;
end;

end.


der Aufruf sieht dann so aus:
ausblenden Delphi-Quelltext
1:
2:
3:
site.Parameter1 := 'test';
site.Parameter2 := 'test';
site.start;


So wie Du es gemacht hast, wird .Start im Mainthread ausgeführt.

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
momo_9376781 Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Mo 17.12.12 10:28 
Hmm ok
Hab das jetzt so abgeändert. Nun kommt eine Fehlermeldung:

... 'Start kann für eine laufenden oder unterbrochenen Thread nicht aufgerufen werden' ...

:-(
momo_9376781 Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Mo 17.12.12 10:30 
AAh ok hatte noich
Site := TThread_Read.Create;
stehen.
Aber wenn ich das raus nehme kommt eine access violation Fehlermeldung ....
Nersgatt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: Mo 17.12.12 10:33 
Der Aufruf muss drin bleiben, aber so aussehen:
ausblenden Delphi-Quelltext
1:
Site := TThread_Read.Create(false);					


So wird der Thread pausiert erstellt. Sonst wird direkt beim erstellen der Instanz der Thread gestartet (also sofort Start -> Execute aufgerufen). Dann hast Du aber keine Chance mehr, die Parameter zu setzen. Also pausiert starten (siehe oben).

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
momo_9376781 Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Mo 17.12.12 10:37 
Sorry aber ich glaub ich checks nicht :-(
Hab den Aufruf jetzt so:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
  Site:= TThread_Read.Create(false);          
  Site.Parameter1 := 'test1';
  Site.Parameter2 := 'test2';
  Site.Start;


Die Fehlermeldung (... 'Start kann für eine laufenden oder unterbrochenen Thread nicht aufgerufen werden' ... ) kommt aber noch
haentschman
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 285
Erhaltene Danke: 33


DX10 Berlin Professional
BeitragVerfasst: Mo 17.12.12 10:43 
user profile iconNersgatt hat folgendes geschrieben Zum zitierten Posting springen:
Der Aufruf muss drin bleiben, aber so aussehen:
ausblenden Delphi-Quelltext
1:
Site := TThread_Read.Create(false);					


So wird der Thread pausiert erstellt. Sonst wird direkt beim erstellen der Instanz der Thread gestartet (also sofort Start -> Execute aufgerufen). Dann hast Du aber keine Chance mehr, die Parameter zu setzen. Also pausiert starten (siehe oben).


...ist genau umgekehrt. Der Parameter beim Create heißt "Suspended". Wenn du den Thread suspended, also nicht laufend, erstellen möchtest ist der Parameter "True". Dann greift auch das "Start".
Nersgatt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: Mo 17.12.12 10:44 
Sorry, mein Fehler. Richtig ist Site:= TThread_Read.Create(True);

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)

Für diesen Beitrag haben gedankt: momo_9376781
haentschman
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 285
Erhaltene Danke: 33


DX10 Berlin Professional
BeitragVerfasst: Mo 17.12.12 10:47 
Kein Problem... :P Da war wohl der Koffeinpegel nicht ausreichend genug.... 8)

Für diesen Beitrag haben gedankt: momo_9376781
momo_9376781 Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Mo 17.12.12 10:47 
Perfekt :-)

Vielen Vielen Dank!