2014-12-14 2 views
1

Как использовать thread для этого кода, этот код делает программу быстрой блокировкой в ​​потоке лучше?IdHTTP Get Response Thread

, как не повторять нить, пока я = ListBox1.Items.Count -1

var 
    lURL : String; 
    lResponse : TStringStream; 
begin 
    lResponse := TStringStream.Create(''); 
    TestText := Form1.ListBox1.Items[i]; 
    I := i +1; 
    Test1 := Copy(TestText, 0, 16); 
    Test2 := Copy(TestText, 18, 3); 
    Test3 := Copy(TestText, 22, 2); 
    Test4 := Copy(TestText, 27, 2); 
try 
    lURL := 'http://www.test.net/test/test.php' + 
    '?n=' + Test1 + 
    '&m=' + Test2 + 
    '&a=' + Test3 + 
    '&cv=' + Test4; 
    idHttp1.Get(lURL, lResponse); 
    lResponse.Position := 0; 
    RichEdit1.Lines.LoadFromStream(lResponse); 
finally 
    IdHTTP1.Free; 
    lResponse.Free(); 
    if Pos('Bazinga',RichEdit1.Text)> 0 then 
    label1.Caption := 'True'; 
end; 
end; 
+0

Вот хороший пример: [Работа с Indy HTTP] (http://etutorials.org/Programming/mastering+delphi + 7/+ Часть IV + Delphi + кнопки + Интернет + и + а + .NET + Preview/Глава + 19 + Интернет + программирование + Sockets + и + Инди/Рабочая + с + HTTP /). Код для Dephi7 - ваш пробег может варьироваться в зависимости от вашей версии. – FoggyDay

+1

[Ожидание потока без замораживания приложения] (http://stackoverflow.com/questions/16908253/wait-for-thread-without-freezing-the-application) – bummi

+0

Какую версию Delphi вы используете? –

ответ

3

Вы можете индивидуализировать загрузки кода в отдельную функцию, например:

function DownloadString(AUrl: string): string; 
var 
    LHttp: TIdHttp; 
begin 
    LHttp := TIdHTTP.Create; 
    try 
    LHttp.HandleRedirects := true; 
    result := LHttp.Get(AUrl); 
    finally 
    LHttp.Free; 
    end; 
end; 

Затем использовать анонимный нить для извлечения содержимого:

procedure TForm3.Button1Click(Sender: TObject); 
var 
    LUrlArray: TArray<String>; 
begin 

    // Your URLs are stored in an array of strings 
    LUrlArray := form1.listbox1.Items.ToStringArray; 

    // This will start an anonymous thread to download the string content from the list of URLs 
    TThread.CreateAnonymousThread(
    procedure 
    var 
     LResult: string; 
     LUrl: string; 
    begin 
     // Fetch each site content from the URL list 
     for LUrl in LUrlArray do 
     begin 
     // DownloadString will be executed asynchronously 
     LResult := DownloadString(LUrl); 

     // Safely update the GUI using TThread.Synchronize or TThread.Queue 
     TThread.Synchronize(nil, 
      procedure 
      begin 
      // Add the resultant string to ??? 
      // Decide where to set the text to 
      memo1.Lines.Text := memo1.Lines.Text + LResult; 
      end 
     ); 
     end; 
    end 
).Start; 

end; 

Обратите особое внимание на часть обновления GUI!

То же самое можно сделать с помощью ITask, если вы использовали Delphi XE7.

Примечание 1: Это хорошо работает для малого содержания полезной нагрузки. Если вы загружаете огромное содержимое или файл, лучше использовать потомок TStream.

Примечание 2: В этом случае только один поток будет загружать содержимое всех URL в

+0

как повторить поток до i = ListBox1.Items.Count -1? im using TestText: = Form1.ListBox1.Items [i]; I: = i +1; Test1: = Копировать (TestText, 0, 16); Test2: = Копировать (TestText, 18, 3); Test3: = Копировать (TestText, 22, 2); Test4: = Копировать (TestText, 27, 2); – Fake

+0

Вы не упомянули, что есть список? Пожалуйста, сначала обновите свой вопрос. –

+0

Обновлено, мне нужно повторить поток. – Fake