Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Indy freeze Problem (https://www.delphipraxis.net/129353-indy-freeze-problem.html)

Novo 17. Feb 2009 18:46


Indy freeze Problem
 
Hi,
ich lese mit Indy.get(URL)
Internetseiten aus, und werte die Informationen aus.
Das soll es alle 10 Sekunden über einen Timer machen.

Das Problem ist, dass dann alle 10 Sekunden die Form für 3 Sekunden freezed!
idAntiFreeze bringt auch nichts!
Jetzt habe ich das so gemacht, als Thread, es freezed immernoch!
:wiejetzt:

GetRadioInfo wird im TimerGetRadioInfoTimer alle 10 Sekunden aufgerufen,
und GetRadioInfo ruft mehrmals function ThreadedHTTP auf, und da hängts!

Delphi-Quellcode:
unit MainU;

//... blabla

function readout(text, vorne, hinten: string): string;
var astring: string;
begin
  astring := copy(text, Pos(vorne, text) + length(Vorne), PosEx(hinten, text, Pos(vorne, text)) - Pos(vorne, text) - length(vorne));
  result := astring;
end;

function StringsucheVor(Quelle,anfang,ende:string):string;
var i,k,erstestelle: longint  ;
    ergebnis : String;
begin
   i := 0  ;
   k := length(anfang);
   ergebnis := '';
   ersteStelle := pos(anfang,Quelle);
   if ersteStelle <> 0 then
   begin
      while copy(Quelle,erstestelle+k+i,1) <> ende do
      begin
         ergebnis := ergebnis + copy(Quelle,erstestelle+k+i,1);
         inc(i);
      end;
   end;
  result := ergebnis;
end;

function ThreadedHTTP(URL:string):string;
var
  cHttp : TidHTTP;
  QuellCode : string;
begin
  cHttp := TidHTTP.Create (Nil);
  Try
QuellCode := cHttp.Get(URL);
  Finally
    cHttp.Free;
    result := QuellCode;
  End
End;  

procedure GetRadioInfo;
var
  //Quellcode der Homepage
  QuellCodeTechnobase : string;
  QuellCodeTrancebase : string;
  QuellCodeHardbase  : string;
  QuellCodeHousetime : string;

  //Technobase
  TechnobaseModerator : string;
  TechnobaseShow     : string;
  TechnobaseStyle    : string;
  TechnobaseListener : string;
  TechnobaseTrack    : string;

  //Trancebase
  TrancebaseModerator : string;
  TrancebaseShow     : string;
  TrancebaseStyle    : string;
  TrancebaseListener : string;
  TrancebaseTrack    : string;

  //Hardbase
  HardbaseModerator : string;
  HardbaseShow     : string;
  HardbaseStyle    : string;
  HardbaseListener : string;
  HardbaseTrack    : string;

  //Housetime
  HousetimeModerator : string;
  HousetimeShow     : string;
  HousetimeStyle    : string;
  HousetimeListener : string;
  HousetimeTrack    : string;

begin
QuellCodeTechnobase := ThreadedHTTP('http://www.technobase.fm');
QuellCodeTrancebase := ThreadedHTTP('http://www.trancebase.fm');
QuellCodeHardbase := ThreadedHTTP('http://www.hardbase.fm');
QuellCodeHousetime := ThreadedHTTP('http://www.housetime.fm');

TechnobaseListener := StringSucheVor(QuellCodeTechnobase, 'TechnoBase</a>:</td><td>', '<');
frmMain.lblTechnobaseListener.caption := TechnobaseListener;

TechnobaseModerator := StringSucheVor(QuellCodeTechnobase, 'target="_top"><span style="color:#FFDD82">', '<');
frmMain.lblTechnobaseModerator.Caption := TechnobaseModerator;

TechnobaseShow := StringSucheVor(QuellCodeTechnobase, '/span></a><span style="color:#DFB649"> mit "', '"');
frmMain.lblTechnobaseShow.Caption := TechnobaseShow;

TechnobaseStyle := StringSucheVor(QuellCodeTechnobase, '"</span><span style="color:#DFB649"> (', ')');
frmMain.lblTechnobaseStyle.Caption := TechnobaseStyle;

TechnobaseTrack := StringSucheVor(QuellCodeTechnobase, '<div style="width:345px;float:left; margin-top:11px; overflow:hidden">', '<');
frmMain.lblTechnobaseTrack.Caption := Trim(TechnobaseTrack);

//---

HardbaseListener := StringSucheVor(QuellCodeHardbase, 'HardBase</a>:</td><td>', '<');
frmMain.lblHardbaseListener.caption := HardbaseListener;

HardbaseModerator := StringSucheVor(QuellCodeHardbase, 'target="_top">', '<');
frmMain.lblHardbaseModerator.caption := HardbaseModerator;

HardbaseShow := StringSucheVor(QuellCodeHardbase, '</a> mit "', '"');
frmMain.lblHardbaseShow.caption := HardbaseShow;

HardbaseStyle := StringSucheVor(QuellCodeHardbase, '" (', ')');
frmMain.lblHardbaseStyle.caption := HardbaseStyle;

HardbaseTrack := StringSucheVor(QuellCodeHardbase, '<div style="width:345px;float:left; margin-top:11px; overflow:hidden">', '<');
frmMain.lblHardbaseTrack.Caption := Trim(HardbaseTrack);

//---

HousetimeListener := StringSucheVor(QuellCodeHousetime, 'HouseTime</a>:</td><td>', '<');
frmMain.lblHousetimeListener.caption := HousetimeListener;

HousetimeModerator := StringSucheVor(QuellCodeHousetime, 'target="_top">', '<');
frmMain.lblHousetimeModerator.Caption := HousetimeModerator;

HousetimeShow := StringSucheVor(QuellCodeHousetime, '</a> mit "', '"');
frmMain.lblHousetimeShow.Caption := HousetimeShow;

HousetimeStyle := StringSucheVor(QuellCodeHousetime, '" (', ')');
frmMain.lblHousetimeStyle.Caption := HousetimeStyle;

HousetimeTrack := StringSucheVor(QuellCodeHousetime, '<div style="width:345px;float:left; margin-top:11px; overflow:hidden">', '<');
frmMain.lblHousetimeTrack.Caption := Trim(HousetimeTrack);

//---

TrancebaseListener := StringSucheVor(QuellCodeTrancebase, 'TranceBase</a>:</td><td>', '<');
frmMain.lblTrancebaseListener.caption := TrancebaseListener;

TrancebaseModerator := StringSucheVor(QuellCodeTrancebase, 'target="_top">', '<');
frmMain.lblTrancebaseModerator.Caption := TrancebaseModerator;

TrancebaseShow := StringSucheVor(QuellCodeTrancebase, '</a> mit "', '"');
frmMain.lblTrancebaseShow.Caption := TrancebaseShow;

TrancebaseStyle := StringSucheVor(QuellCodeTrancebase, '" (', ')');
frmMain.lblTrancebaseStyle.Caption := TrancebaseStyle;

TrancebaseTrack := StringSucheVor(QuellCodeTrancebase, '<div style="width:345px;float:left; margin-top:11px; overflow:hidden">', '<');
frmMain.lblTrancebaseTrack.Caption := Trim(TrancebaseTrack);
end;


procedure TfrmMain.TimerGetRadioInfoTimer(Sender: TObject);
begin
GetRadioInfo;
end;

end.
achja... und :dp:

Meflin 17. Feb 2009 19:06

Re: Indy freeze Problem
 
Und wo genau denkst du jetzt, dass dein HTTP-Request threaded abläuft :gruebel:

Novo 17. Feb 2009 19:33

Re: Indy freeze Problem
 
Zitat:

Zitat von Meflin
Und wo genau denkst du jetzt, dass dein HTTP-Request threaded abläuft :gruebel:

äh xD?
oh^^
:duck:

so besser?

Delphi-Quellcode:
function ThreadedHTTPTechnobase():string;
var
  cHttp : TidHTTP;
  QuellCode : string;
begin
  cHttp := TidHTTP.Create (Nil);
  Try
QuellCode := cHttp.Get([url]http://www.technobase.fm[/url]);
  Finally
    cHttp.Free;
    result := QuellCode;
  End
End;
... usw.
also für alle 4 extra Threaded function?
ist immernoch net besser :coder:

Meflin 17. Feb 2009 19:34

Re: Indy freeze Problem
 
Nein. du erstellst immernoch nirgends einen Thread! Dazu müsstest du ein Exemplar von TThread erzeugen oder aber BeginThread verwenden ;)
http://www.hsg-kl.de/faecher/inf/mat...eads/index.php

Novo 17. Feb 2009 19:52

Re: Indy freeze Problem
 
Zitat:

Zitat von Meflin
Nein. du erstellst immernoch nirgends einen Thread! Dazu müsstest du ein Exemplar von TThread erzeugen oder aber BeginThread verwenden ;)
http://www.hsg-kl.de/faecher/inf/mat...eads/index.php

aah so geht das ...
Muss erstmal wieder Delphi und alle Komponenten neu installieren, ich erstelle nämlich gerade eine Windows Se7en Komponente, diese hat mir aber beim Installieren alle anderen Komponenten geschrottet xD.

Nacher teste ich es mal!


EDIT:
Hmm habs imemrnoch nicht so ganz Verstanden, wie das mit dem Thread funktioniert!
Anhand der Beep Demo auf der Seite da hab ichs verstanden, wenn ich das mit Indy mache, gehts immernoch nicht :S
Morgen 2. Versuch
GN8

Novo 19. Feb 2009 12:29

Re: Indy freeze Problem
 
Hm also irgendwie funktioniert mein Thread nicht.
Ich kann es zwar threaded machen, allersings kann ich dann dem Thread keine URL oder sowas übergeben, da das dann trotzdem freezed

Meflin 19. Feb 2009 12:31

Re: Indy freeze Problem
 
Nimm doch einfach Synapse:
http://www.ararat.cz/synapse/doku.php

die sind von Haus aus multithreaded...

Luckie 19. Feb 2009 12:46

Re: Indy freeze Problem
 
Zitat:

Zitat von Novo
Hm also irgendwie funktioniert mein Thread nicht.
Ich kann es zwar threaded machen, allersings kann ich dann dem Thread keine URL oder sowas übergeben, da das dann trotzdem freezed

Dann machst du irgendwas falsch. Zeig uns doch mal den Code von deinem Thread.

@Meflin: Ich glaube nicht, dass eine andere Komponentensammlung was an dem Problem ändert.

Meflin 19. Feb 2009 12:48

Re: Indy freeze Problem
 
Zitat:

Zitat von Luckie
@Meflin: Ich glaube nicht, dass eine andere Komponentensammlung was an dem Problem ändert.

Klar, ein Download via Synapse läuft ansynchron, sprich sien Programm wartet nicht auf das Ende sprich es friert nicht ein. es sei denn du mientest mit Problem das mangelnde Verständnis der Threads :stupid:

Novo 20. Feb 2009 11:08

Re: Indy freeze Problem
 
@Luckie
Kannst du mir einen Thread machen, das:
idHTTP.create
result := idhttp.get(URL)

also ein Thread als Funktion die ich mit de mParameter (der URL) aufrufen kann
oder ich mache halt 4 eigene Threads mit jeweils einer anderen URL


also ich muss:
Quellcode einer URL holen
per POS StringSucheVor die Infos aus dem Quellcode rausholen
Die Infos auf einem Label Anzeigen
und das mehrmals mit verschiedenen URLS und Suchparameter

wie soll ich das Theraded machen?

Novo 20. Feb 2009 20:12

Re: Indy freeze Problem
 
hmm was ist da falsch?

Delphi-Quellcode:
function ThreadedHTTP(URL:string):string;
var
  Thttp : TidHTTP;
  QuellCode : string;
begin
  Thttp := TidHTTP.Create (nil);
   try
    QuellCode := Thttp.Get(URL);
   finally
    Thttp.Free;
    result := QuellCode;
  End
End;
und dann:
Delphi-Quellcode:
QuellCodeTechnobase := ThreadedHTTP('http://www.technobase.fm');
application.ProcessMessages;
QuellCodeTrancebase := ThreadedHTTP('http://www.trancebase.fm');
application.ProcessMessages;
QuellCodeHardbase := ThreadedHTTP('http://www.hardbase.fm');
application.ProcessMessages;
QuellCodeHousetime := ThreadedHTTP('http://www.housetime.fm');

Meflin 20. Feb 2009 21:00

Re: Indy freeze Problem
 
Nix is falsch. Nur falls du denkst, dass das jetzt "threaded" ist, dann liegst du falsch :roll:

Novo 20. Feb 2009 22:26

Re: Indy freeze Problem
 
Zitat:

Zitat von Meflin
Nix is falsch. Nur falls du denkst, dass das jetzt "threaded" ist, dann liegst du falsch :roll:

aha xD und wie sieht es aus, wenn das Threaded ist?

Meflin 20. Feb 2009 23:23

Re: Indy freeze Problem
 
Zitat:

Zitat von Novo
aha xD und wie sieht es aus, wenn das Threaded ist?

z.B. so: http://www.delphipraxis.net/internal...002714#1002714 :gruebel:

Luckie 20. Feb 2009 23:52

Re: Indy freeze Problem
 
Also ich weiß nicht wo das Problem ist. Du erstellst eine Thread-Klasse von TThread abgeleitet. Dieser fügst du ein neues Property URL hinzu. In der Execute-Methode erstellst du die Indy-Komponente und gibst sie am Ende wieder frei:
Delphi-Quellcode:
unit Unit3;

interface

uses
  Classes;

type
  TDownloadThread = class(TThread)
  private
    { Private-Deklarationen }
    FURL: string;
    FCode: string;
    procedure ShowCode;
  public
    property URL: string read FURL write FURL;
  protected
    procedure Execute; override;
  end;

implementation

uses
  IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP, Unit2;

{ TDownloadThread }

procedure TDownloadThread.Execute;
var
  IdHTTP: TIdHTTP;
begin
  IdHTTP := TIdHTTP.Create(nil);
  try
    FCode := IdHTTP.Get(URL);
  finally
    IdHTTP.Free;
  end;
  Synchronize(ShowCode);
end;

procedure TDownloadThread.ShowCode;
begin
  Form2.Memo1.Text := FCode;
end;

end.
Und der Aufruf:
Delphi-Quellcode:
uses
  Unit3;

procedure TForm2.Button1Click(Sender: TObject);
var
  DownloadThread: TDownloadThread;
begin
  DownloadThread := TDownloadThread.Create(True);
  DownloadThread.FreeOnTerminate := True;
  DownloadThread.URL := 'http://www.michael-puff.de';
  DownloadThread.Resume;
end;
Das sollte als Grundgerüst reichen. Das ganze kann man jetzt noch um eine Fortschrittsanzeige und die Möglichkeit das ganze abzubrechen erweitern.abzubrechen

Novo 21. Feb 2009 00:05

Re: Indy freeze Problem
 
Zitat:

Zitat von Luckie
Also ich weiß nicht wo das Problem ist. Du erstellst eine Thread-Klasse von TThread abgeleitet. Dieser fügst du ein neues Property URL hinzu. Im Konstruktor des Threads erstellst du im Code deine Indy-Komponente und übergibst ihr die URL aus dem Property. Und im Destruktor des Threads gibst du die Komponent wieder frei.

Habe ich doch, aber es freezed trotzdem die Form!

Luckie 21. Feb 2009 00:59

Re: Indy freeze Problem
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hast du ein Glück, dass ich nicht schlafen kann. Im Anhang eine lauffähige Demo inklusive Ereignissen. Bei mir friert da nichts ein. Einfriren tut es nur, wenn du andauernt Synchronize aufrufst, denn der Code wird dann im Kontext des Hauptthreads ausgeführt und gerade das wollen wir ja nicht. aLSO Synchronize nicht zu häufig aufrufen.

Meflin 21. Feb 2009 08:35

Re: Indy freeze Problem
 
Zitat:

Zitat von Novo
Habe ich doch, aber es freezed trotzdem die Form!

Ach echt, hast du? Wo genau in dienem Code kommt denn das Wort TThread vor :wall:

Novo 21. Feb 2009 10:51

Re: Indy freeze Problem
 
Zitat:

Zitat von Meflin
Zitat:

Zitat von Novo
Habe ich doch, aber es freezed trotzdem die Form!

Ach echt, hast du? Wo genau in dienem Code kommt denn das Wort TThread vor :wall:

ööh ... xD

Zitat:

Zitat von Luckie
Hast du ein Glück, dass ich nicht schlafen kann. Im Anhang eine lauffähige Demo inklusive Ereignissen. Bei mir friert da nichts ein. Einfriren tut es nur, wenn du andauernt Synchronize aufrufst, denn der Code wird dann im Kontext des Hauptthreads ausgeführt und gerade das wollen wir ja nicht. aLSO Synchronize nicht zu häufig aufrufen.

ah THX!
SO muss des aussehen, ja ne jetzt tuts auch danke!


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:40 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz