2016-07-26 18 views
0

これを行うにはどのような方法が最適です:私はウェブアドレスでいっぱいのtxtファイルを持っていますが、私はidHTTPコンポーネントを使ってすべてをチェックしなければならず、サーバー、htmlをダウンロードして一致を見つける、私はそれが速く、スレッドの種類がありますが、私はTParallel forまたはTask threadsまたは定期的なスレッドを使用するのが最善であるかわからないのですか? 私はTParallel forの前に試してみましたが、私はTask threadsでも試しましたが、AVリクエストは時間がかかりますが、通常のスレッドも試してみました。 。
注:専門家から助言が必要なだけではありません。ありがとうございますhttpリクエストを行う最良の方法は何ですか

+1

「チェック」とはどういう意味ですか?ヘッダーのみをダウンロードすることを意味しますか?それが有効なURLかどうかを確認しますか?そのURLにあるデータ/コンテンツの一部を確認しますか?目的に合わせて 'TParallel'や' TTask'を使うべきかどうか本当の疑問ですか?いずれにしても、それらのすべてが広範な質問で有名な回答を引き寄せています - どちらもここで眉をひそめます。これまでに何を試しましたか?これら2つの可能な解決法の間にあなたは自分自身で賛否両論を見ましたか? –

+0

@JerryDodge HTMLをダウンロードして試合を探して、情報を追加しました。 – cyberdude

答えて

1

最初のアドバイス: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に移行しました。

+0

なぜIndyを使用しないことをアドバイスしますか? – mjn42

+0

mjn42 @ - なぜインディに対するI: 1)THTTPClientは、SSLプロトコル 2で動作するため、追加のDLLを必要としません)THTTPClientは、Delphi XE8 3から近代的である)私の主観的な意見:はるかにスムーズに動作しますTHTTPClient(と少ない問題)、その後、インディライブラリ。私は過去10年間Indyを使用しましたが、今サポートされているプロジェクトはすべてTHTTPClientに移行しました。 – Zam

+0

ここを見てください[http://stackoverflow.com/posts/comments/64687148?noredirect=1] – cyberdude

0

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; 
+0

私は 'ShowMessage(FOutput);を使うといいと思います。 – Zam

+0

私は誰もそれを使って非常に多くの長いソースを読むことはないと思います。これがデータを処理する場所です。私はあなたのためにそれを更新します。 – smooty86

+0

私は以前このメソッドを使っていましたが、ループ内で複数の投稿を使用している場合、このポストレスポンスは時間の経過とともに遅くなります – cyberdude

関連する問題