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
Antwort
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.
Warum raten Sie von der Verwendung von Indy ab? – mjn42
@ 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
schau mal hier [http://stackoverflow.com/posts/comments/64687148?noredirect=1] – cyberdude
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;
Ich nehme an, 'ShowMessage (FOutput);' ist keine gute Idee. – Zam
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
Ich habe diese Methode schon einmal benutzt, aber diese Post-Antwort wird langsamer, wenn Sie mehrere Posts innerhalb einer Schleife verwenden. – cyberdude
- 1. Lazy Loading - was ist der beste Ansatz?
- 2. Was ist der beste Ansatz, um von der relationalen OLTP-Datenbank zum OLAP-Cube zu gelangen?
- 3. Was ist der beste Weg, um eine Eigenschaft zu deklarieren?
- 4. Was ist der beste Ansatz, um Anfangsdaten in Backbone.js zu laden?
- 5. Der beste Weg, um Rollover zu machen?
- 6. Was ist der beste Weg, um eine Tabelle zu deduplizieren?
- 7. Was ist der beste Weg, um eine IllegalArgumentException zu fangen
- 8. Was ist der beste Weg, um eine Liste zu kopieren?
- 9. Was ist der beste Weg, um eine Animation zu fahren?
- 10. Was ist der beste Weg, um eine Sitemap zu erstellen?
- 11. Was ist der beste Weg, um eine Enumeration zu erhöhen?
- 12. Was ist der empfohlene Ansatz, um ein SlickGrid zu stylen?
- 13. Was ist der richtige Ansatz, um SPOJ DIEHARD zu lösen?
- 14. Was ist der beste Ansatz für statische Ressourcen im Precache?
- 15. Was ist der beste Ansatz Parse.Collections in JavaScript ersetzen
- 16. Was ist der beste Ansatz, um 2 große Textdateien in Java zu sortieren?
- 17. Was ist der beste Ansatz, um MySQL-Tabellenzeilen nach Benutzerauswahl zu sortieren?
- 18. Was ist der beste Ansatz, um Objektdiagramme über Ebenen/Ebenen hinweg zu behandeln?
- 19. Was ist der beste Ansatz in SQL, um mehrstufige Beschreibungen zu speichern?
- 20. Was ist der beste Ansatz, um die Redux-Zustandsgröße zu reduzieren?
- 21. Was ist der beste Ansatz um 2 Tabellen aus verschiedenen Datenbanken zu verbinden?
- 22. Was ist der beste Weg, um eine Seite nur über localhost zugänglich zu machen?
- 23. Was ist der beste Weg, um eine feste Topbar zu machen, die die Oberseite nicht überlappt?
- 24. Was ist der beste Weg, um eine hüpfende Ballanimation mit Endlosschleife auf dem iPhone zu machen?
- 25. Was ist der beste Weg, um eine Mapping-Anwendung für das iPhone zu machen
- 26. Was ist der beste Weg, um eine tiefe Kopie einer Datenstruktur in Perl zu machen?
- 27. Der beste Weg, um eine iPhone-Anwendung mehrsprachig zu machen
- 28. Was ist der beste Ansatz, um ein beliebtes Produkt "Sortieren" in jedem E-Commerce zu implementieren?
- 29. Was ist der beste Ansatz, um eine Aufgabe mit Timer nur 5-mal auszuführen?
- 30. Was ist der beste Ansatz, um zwei Spalten mit Daten in einer Tabelle zu vergleichen?
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? –
@JerryDodge Download der HTML und Suche nach einer Übereinstimmung, Infomrammation hinzugefügt. – cyberdude