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