Завершение потока с http get прекращение запроса - PullRequest
0 голосов
/ 02 апреля 2012

У меня есть этот код внутри потока, и когда я вызываю терминатор, он быстро завершается, если он не находится в середине http-запроса, но когда у меня 20 потоков, требуется время для завершения http-запроса и выхода из потока.КОД:

    procedure TParser.Execute;
var

   i,b:integer;
   t:string;
   begin
http := thttpsend.create;
http.KeepAlive:=true;
Ftest:=TStringList.Create;
{http.timeout:=5000;}
for i:=0 to FStartNum.Count do

if  FLocalVariable<FStartNum.Count-FThreadCount   then
begin
if terminated then begin
exit;
end
else

EnterCriticalSection(Form1.StringSection);
 try



FLocalVariable := form1.GlobalVariable;
Inc(FLocalVariable);
form1.GlobalVariable := FLocalVariable;


 finally

LeaveCriticalSection(Form1.StringSection);
http.Clear;

HTTP.HTTPMethod('GET',FStartNum.Strings[FLocalVariable]);
      Ftest.LoadFromStream(HTTP.Document);

      Synchronize(progress);
parse;
Ftest.Clear;

end;
end;
end;

Как остановить этот HTTP-запрос из основной формы:

HTTP.HTTPMethod('GET',FStartNum.Strings[FLocalVariable]);
          Ftest.LoadFromStream(HTTP.Document);

Спасибо

Редактировать: Код завершения:

for i:=Low(fparser) to High(fparser) do
    begin
    Fparser[i].Terminate();

    end;

1 Ответ

1 голос
/ 02 апреля 2012

Вызовите метод THttpSend.Abort(), чтобы остановить передачу, которая выполняется. Вы можете сделать это в событии THttpSend.OnStatus, например:

procedure TParser.Execute;
var
  ...
begin
  http := THttpSend.Create;
  http.OnStatus := HttpStatus;
  ...
end;

procedure TParser.HttpStatus(Sender: TObject; Reason: THookSocketReason; const Value: String);
begin
  if Terminated then Http.Abort;
end;
...