Thema: Delphi IDHttp und Thread

Einzelnen Beitrag anzeigen

Benutzerbild von Dani
Dani

Registriert seit: 19. Jan 2003
732 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: IDHttp und Thread

  Alt 10. Apr 2008, 14:19
Zitat:
Ist das was ich vorhabe sehr kompliziert?
Threads eigenen sich hervorragend, um beliebig komplizierte Fehler zu produzieren . Ein Problem ist, dass es viele Wege gibt, eine Aufgabe zu lösen. Jede Lösung setzt aber vorraus, dass man weiß, was man tut und was die Rahmenbedingungen sind.

Zitat:
Ich habe ein Stringgrid in dem in einer Spalte Domainnamen stehen die ich mit IdHttp überprüfen will.
Als Programmierer musst du diese Aufgabe in ein Modell umwandeln. Das könnte z.B. so aussehen:

Delphi-Quellcode:
type
  TDomainAbfrageErgebnis = (daUnbekannt, daExistiert, daExistiertNicht);

  TDomainAbfrage = class(TObject)
  private
    FDomain: String;
    FErgebnis: TDomainAbfrageErgebnis;
  public
    constructor Create(Domain: String);
    
    property Domain: String read FDomain write FDomain;
    property Ergebnis: TDomainAbfrageErgebnis read FErgebnis;
  end;
Bitte daran denken, dass dieser Code nicht zum kopieren und einfügen gedacht ist, sondern nur zum Verständnis beitragen soll. Mit dieser Klasse haben wir also schonmal die Ein- und Ausgaben der Aufgabe modelliert. Es fehlt aber noch der Vorgang, wo ermittelt wird, ob die Domain existiert (übrigens würde ich für die reine Namensauflösung lieber IdDNSResolver nehmen). Also:

Delphi-Quellcode:
type
  TDomainAbfrageErgebnis = (daUnbekannt, daExistiert, daExistiertNicht);

  TDomainAbfrage = class(TObject)
  private
    FDomain: String;
    FErgebnis: TDomainAbfrageErgebnis;
  public
    constructor Create(Domain: String);
     
    procedure Durchfuehren;

    property Domain: String read FDomain write FDomain;
    property Ergebnis: TDomainAbfrageErgebnis read FErgebnis;
  end;

{...}

procedure TDomainAbfrage.Durchfuehren;
var
  DNSResolver: TIdDNSResolver;
begin
  DNSResolver := TIdDNSResolver.Create;
  try
    // Oder wie auch immer TIdDNSResolver funktioniert...das überlasse ich mal dir :)
    // Indy-Exceptions abfangen nicht vergessen!
    case DNSResolver.Resolve(FDomain) of
      Jawohl: FErgebnis := daExistiert;
      Neeein: FErgebnis := daExistiertNicht;
      Fehler: FErgebnis := dsUnbekannt;
    end;
  finally
    DNSResolver.Free;
  end;
end;
Jetzt ist unser Modell in der Lage, das Ergebnis einer DNS-Abfrage zu ermitteln. Aber wo ist der Thread? Irgendwo im Programm muss ja die Methode "Durchfuehren" einer TDomainAbfrage-Instanz aufgerufen werden. Dafür ist der "Arbeiter-Thread" zuständig:

Delphi-Quellcode:
type
  TArbeiterThread = class(TThread)
  private
    FAktuelleAufgabe: TDomainAbfrage;
  protected
    procedure Execute; override;
  end;

implementation

procedure TArbeiterThread.Execute;
begin
  // Pseudocode:
  // "Endlosschleife", welche so lange DNS-Aufgaben abarbeitet, bis keine
  // Aufgaben mehr übrig sind.
  while not Termiated do begin
    Synchronize(HoleNächsteAufgabe);
    if AufgabeWurdeGeholt then begin
      FAktuelleAufgabe.Durchführen;
    end;
  end;
end;
Was man hier nicht sieht: du musst natürlich irgendwo im Programm eine Liste von Threads und eine Liste von Aufgaben verwalten, mit den erwähnten Tücken beim gemeinsamen Zugriff!

So, jetzt hab ich mal einen konkreten Lösungsansatz angerissen. Hast du dazu noch irgendwelche Fragen? Falls nicht, kannst du dir noch alzaimars Workerthread-Pool anschauen. Das ist im Wesentlichen das gleiche Prinzip.
Dani H.
At Least I Can Say I Tried
  Mit Zitat antworten Zitat