これを行うにはどのような方法が最適です:私はウェブアドレスでいっぱいのtxtファイルを持っていますが、私はidHTTPコンポーネントを使ってすべてをチェックしなければならず、サーバー、htmlをダウンロードして一致を見つける、私はそれが速く、スレッドの種類がありますが、私はTParallel for
またはTask threads
または定期的なスレッドを使用するのが最善であるかわからないのですか? 私はTParallel for
の前に試してみましたが、私はTask threads
でも試しましたが、AVリクエストは時間がかかりますが、通常のスレッドも試してみました。 。
注:専門家から助言が必要なだけではありません。ありがとうございますhttpリクエストを行う最良の方法は何ですか
答えて
最初のアドバイス:Indyを使用しないでください。 THTTPClient(ユニットSystem.Net.HttpClient
) - Delphi XEネイティブ?+
私はまだ古いTThreadsを使用しています。私はTThreadだけで提案をすることができました。
ワークフロー:
メインスレッド - ラインであなたのTXTファイルの行を読み込みます。 行が読み込まれた後、WWWから情報をダウンロードするNEWスレッドを作成します。アプリケーションの
サンプル:
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.
なぜインディに対する:
1)THTTPClientは、SSLプロトコルと連携するための追加のDLLを必要としません
2)THTTPClientは、Delphi XE8
から近代的です3)私の主観的意見:THTTPClientはIndyライブラリよりはるかにスムーズに(問題が少ない)動作します。私は過去10年間Indyを使用しましたが、今サポートされているプロジェクトはすべてTHTTPClientに移行しました。
なぜIndyを使用しないことをアドバイスしますか? – mjn42
mjn42 @ - なぜインディに対するI: 1)THTTPClientは、SSLプロトコル 2で動作するため、追加のDLLを必要としません)THTTPClientは、Delphi XE8 3から近代的である)私の主観的な意見:はるかにスムーズに動作しますTHTTPClient(と少ない問題)、その後、インディライブラリ。私は過去10年間Indyを使用しましたが、今サポートされているプロジェクトはすべてTHTTPClientに移行しました。 – Zam
ここを見てください[http://stackoverflow.com/posts/comments/64687148?noredirect=1] – cyberdude
TTaskとIndy(TIdHTTP)を使用できます。例:
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;
- 1. Electronでは、Ajaxリクエストを作成する最良の方法は何ですか?
- 2. Python 3で複数のHTTPリクエストを送信する最良の方法は何ですか?
- 3. JQueryを使用せずにJavaScriptでAJAXリクエストで長いポーリングを行う最良の方法は何ですか?
- 4. grailsでサービスを扱う最良の方法は何ですか
- 5. PHPで国際化を行う最良の方法は何ですか?
- 6. "カップル"システムをレールで行う最良の方法は何ですか?
- 7. PythonでBit Field操作を行う最良の方法は何ですか?
- 8. Asp.Net MVCで自動取引を行う最良の方法は何ですか?
- 9. Javascriptでブラウザ検出を行う最良の方法は何ですか?
- 10. UnityのサーバーにGETリクエストを行う最良の方法
- 11. matlabの音声アプリケーションのノイズフィルタリングを行う最良の方法は何ですか?
- 12. asp.netのhttpリクエストからXMLを取得する最も良い方法は?
- 13. concatenting stringそれを行うための最良の方法は何ですか?
- 14. Perlで同時にWebリクエストを行う最速の方法は何ですか?
- 15. javascriptでhttpリクエストを行う方法
- 16. 衝突検出を行う最も良い方法は何ですか?
- 17. 最も簡単な方法は、javaでhttpリクエストを行うことです
- 18. WebClientはhttpデータをダウンロードする最良の方法ですか?
- 19. コアデータから行数を照会する最良の方法は何ですか?
- 20. Erlangで定期的に何かを行う最良の方法は何ですか?
- 21. JavaでJavaScriptを実行する最良の方法は何ですか?
- 22. oracleでバルク挿入を実行する最良の方法は何ですか?
- 23. iOSでRootViewControllerを探す最良の方法は何ですか
- 24. Completable(RX2)の実行をキャンセルする最良の方法は何ですか?
- 25. HTTPリクエストを実行して404を確認する最も速い方法は何ですか?
- 26. Pythonの行から抽出する最も良い方法は何ですか
- 27. レスキューブロックを行う最良の方法
- 28. javascriptの実行をプロファイルする最も良い方法は何ですか?
- 29. jQueryを実行する最良の方法は何ですか.change()
- 30. "replace-if"を実行する最良の方法は何ですか?
「チェック」とはどういう意味ですか?ヘッダーのみをダウンロードすることを意味しますか?それが有効なURLかどうかを確認しますか?そのURLにあるデータ/コンテンツの一部を確認しますか?目的に合わせて 'TParallel'や' TTask'を使うべきかどうか本当の疑問ですか?いずれにしても、それらのすべてが広範な質問で有名な回答を引き寄せています - どちらもここで眉をひそめます。これまでに何を試しましたか?これら2つの可能な解決法の間にあなたは自分自身で賛否両論を見ましたか? –
@JerryDodge HTMLをダウンロードして試合を探して、情報を追加しました。 – cyberdude