2012-04-02 8 views
0

Ich habe diesen Code innerhalb Thread und wenn ich terminieren, beendet es schnell, wenn es nicht in der Mitte der http-Anfrage ist, aber wenn ich 20 Threads habe, dauert es Zeit, http-Anfrage beenden und beenden der Faden. Code:Thread-Kündigung mit http Get-Anfrage beenden

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; 

Wie komme ich vom Hauptformular diese HTTP-Anforderung zu stoppen:

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

Dank

Edit: Termination Code:

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

    end; 

Antwort

1

Rufen Sie die THttpSend.Abort() Methode Stoppen Sie eine Übertragung, die gerade ausgeführt wird. Sie können das tun in dem THttpSend.OnStatus Ereignis, zB:

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

versucht, und einige Verfahren wie http://forum.4programmers.net/Delphi_Pascal/129730-Synapse_FTPSend?sort=votes hier anmelden musste sie und jetzt Ich bekomme [Error] Unit5.pas (115): Inkompatible Typen: 'blcksock.THookSocketReason' und 'Unit5.THookSocketReason'. Sollte ich mehr Einheiten in Verwendungsliste deklarieren. Danke. Edit: hinzugefügt blcksock zu verwendet und es funktioniert. Danke –

+1

Unit5 sollte nicht seinen eigenen "THookSocketReason" -Typ deklarieren, sondern stattdessen den von "blcksock" unt verwenden, dann bekommst du den Unbigkeitsfehler nicht. –