2016-07-26 5 views
0

Was ist die beste Methode, dies zu tun: Ich habe eine TXT-Datei mit Web-Adressen gefüllt, ich muss alle mit IDHTTP-Komponente, nur eine einfache Überprüfung aus einem Web überprüfen server, downloade die html und finde eine übereinstimmung, ich will es schnell zu sein, gibt es verschiedene arten von threads und ich bin mir nicht sicher, was ist das beste zu verwenden, a TParallel for oder Task threads oder regelmäßige threads? Ich probierte vor TParallel for und ich steckte bei AV, auch habe ich versucht Task threads aber es ist nicht schnell, die HTTP-Anfrage wird langsamer von Zeit, ich versuchte auch die regulären Threads und ich wusste nicht, wie man es verwendet, weil es kompliziert zu verwenden .
hinweis: bitte nicht downvote ich brauche nur rat von den experten. DankeWas ist der beste Ansatz, um eine HTTP-Anfrage zu machen

+1

Was meinen Sie mit "check"? Meinst du nur die Header herunterladen? Überprüfen Sie, ob es eine gültige URL ist oder nicht? Überprüfen Sie einige der Daten/Inhalte, die unter dieser URL gefunden werden? Ist Ihre eigentliche Frage, ob Sie 'TParallel' oder' TTask' für Ihren Zweck verwenden? In jedem Fall sind das alles allgemeine Fragen, die zu rechtfertigenden Antworten führen - beide sind hier verpönt. Was hast du bisher versucht? Welche Vor- und Nachteile haben Sie selbst zwischen diesen beiden möglichen Lösungen beobachtet? –

+0

@JerryDodge Download der HTML und Suche nach einer Übereinstimmung, Infomrammation hinzugefügt. – cyberdude

Antwort

1

Erste Ratschläge: Indy nicht verwenden. Verwenden Sie THTTPClient (Einheit System.Net.HttpClient) - nativ für Delphi XE? +

Ich benutze immer noch alte TThreads. Ich könnte nur mit TThread einen Vorschlag machen.

Workflow:

Hauptthread - Ihre TXT-Datei Zeile für Zeile zu lesen. Nachdem die Zeile gelesen wurde, erstellen Sie einen neuen Thread, der Informationen aus dem WWW herunterlädt.

Beispiel der Anwendung:

unit ufmMain; 

interface 

uses 
    Winapi.Windows, Winapi.Messages, 
    System.SysUtils, System.Variants, 
    { TThread } 
    System.Classes, 
    Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls; 

type 
    TForm1 = class(TForm) 
    Button1: TButton; 
    procedure Button1Click(Sender: TObject); 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

    TLoad = class(TThread) 
    protected 
    FURL, 
    FOutputFileName: String; 

    procedure Execute; override; 
    public 
    constructor Create(const AURL, AOutputFileName: String); overload; 
    end; 

    HTTP = class 
    public 
    class procedure Get(const AURL: String; out AOutputStream: TMemoryStream); 
    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.dfm} 

uses 
    { THTTPClient } 
    System.Net.HttpClient; 

procedure TForm1.Button1Click(Sender: TObject); 
var 
    LLoad: TLoad; 
    LFile: TextFile; 
    LCycle: Integer; 
    LUrl: String; 
begin 
    LCycle := 0; 

    AssignFile(LFile, 'urls.txt'); 
    try 
    Reset(LFile); 

    while not Eof(LFile) do 
     begin 
     { Using for generate file name. All file names must be unique } 
     Inc(LCycle); 

     { Read next URL } 
     ReadLn(LFile, LUrl); 

     { Create new thread } 
     LLoad := TLoad.Create(LUrl, 'Output file No ' + LCycle.ToString + '.htm'); 
     LLoad.FreeOnTerminate := True; 
     LLoad.Start; 
     end; 
    finally 
    CloseFile(LFile); 
    end; 
end; 

{ TLoad } 

constructor TLoad.Create(const AURL, AOutputFileName: String); 
begin 
    inherited Create(True); 

    FURL := AURL; 
    FOutputFileName := AOutputFileName; 
end; 

procedure TLoad.Execute; 
var 
    LResponse: TMemoryStream; 
begin 
    inherited; 

    LResponse := TStringStream.Create; 
    try 
    HTTP.Get(FURL, LResponse); 

    { Save result to file } 
    LResponse.SaveToFile(GetCurrentDir + PathDelim + FOutputFileName); 
    finally 
    LResponse.Free; 
    end; 
end; 

{ HTTP } 

class procedure HTTP.Get(const AURL: String; out AOutputStream: TMemoryStream); 
var 
    LStream: TStream; 
    LHTTPClient: THTTPClient; 
begin 
    LHTTPClient := THTTPClient.Create; 
    try 
    LStream := LHTTPClient.Get(AURL).ContentStream; 

    AOutputStream.CopyFrom(LStream, LStream.Size); 
    finally 
    LHTTPClient.Free; 
    end; 
end; 

end. 

Warum ich gegen Indy:

1) THTTPClient keine zusätzliche DLL für Arbeiten mit SSL-Protokoll erforderlich

2) THTTPClient ist modern von Delphi XE8

3) Meine subjektive Meinung: THTTPClient funktioniert viel reibungsloser (mit weniger Problemen) als Indy-Bibliothek. Ich habe Indy für die letzten 10 Jahre benutzt, aber jetzt sind alle meine unterstützten Projekte zu THTTPClient umgezogen.

+0

Warum raten Sie von der Verwendung von Indy ab? – mjn42

+0

@ mjn42 - Warum ich gegen Indy: 1) THTTPClient keine zusätzliche DLL für Arbeiten mit SSL-Protokoll erforderlich 2) THTTPClient moderne von Delphi XE8 3) Meine subjektiven Meinung: THTTPClient reibungslos viel mehr funktioniert (mit weniger Probleme), dann Indy-Bibliothek. Ich habe Indy für die letzten 10 Jahre benutzt, aber jetzt sind alle meine unterstützten Projekte zu THTTPClient umgezogen. – Zam

+0

schau mal hier [http://stackoverflow.com/posts/comments/64687148?noredirect=1] – cyberdude

0

Sie können TTask und Indy (TIdHTTP) verwenden. Beispiel:

function GetUrl(const aUrl: string): ITask; 
begin 
    Result := TTask.Run(
    procedure 
    var 
     FOutput: string; 
     FHTTP: TIdHTTP; 
    begin 
     FHTTP:=TIdHTTP.Create(nil); 
     try 
     try 
      FOutput:=FHTTP.Get(aUrl); 
     except 
      // handle errors 
     end; 
     finally 
     FHTTP.Free; 
     end; 

     TThread.Synchronize(nil, 
     procedure 
     begin 
      ProcessOutput(FOutput); // send your output/result to main thread 
     end); 
    end); 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
var 
    i: Integer; 
    list: TStringList; 
begin 
    list:=TStringList.Create; 
    try 
    list.LoadFromFile('yourfile.txt'); 

    // get all your urls 
    // you should control how many threads run at the same time 
    for i := 0 to list.Count-1 do 
     GetUrl(list[i]); 
    finally 
    list.Free; 
    end; 
end; 
+0

Ich nehme an, 'ShowMessage (FOutput);' ist keine gute Idee. – Zam

+0

Ich nehme nicht an, dass irgendjemand es benutzen wird, um so viele lange Quellen zu lesen. Das ist der Ort, um Daten zu verarbeiten. Ich werde es für Sie aktualisieren. – smooty86

+0

Ich habe diese Methode schon einmal benutzt, aber diese Post-Antwort wird langsamer, wenn Sie mehrere Posts innerhalb einer Schleife verwenden. – cyberdude

Verwandte Themen