Cześć wszystkim. Piszę program i mam problem z zawieszaniem wątku przy pobieraniu strony.
Jest wątek, który tworzy klasę i za jej pomocą pobiera stronę. Wygląda to mniej więcej tak:
type
TWatek = class(TThread)
private
MojaKlasa : TLogowanie;
id : integer;
protected
procedure Execute; override;
public
constructor Create(aid : integer);
end;
constructor TWatek.Create(aid : integer);
begin
inherited Create(False);
self.id := aid;
MojaKlasa := TLogowanie.Create;
end;
procedure TWatek.Execute;
begin
FreeOnTerminate := true;
while (true)
begin
MojaKlasa.zaloguj();
MojaKlasa.wyslij(jakasstrona);
MojaKlasa.wyslij(jakasstrona2);
MojaKlasa.wyloguj();
sleep(15*60*1000);
end;
MojaKlasa.Free;
end;
Klasa Logowanie wygląda tak
type TLogowanie = class
function zaloguj() : boolean;
function Wyslij(link : string) : string;
procedure Wyloguj();
private
HTTP : TidHTTP;
public
constructor Create();
destructor Free();
end;
constructor TLogowanie.Create();
begin
HTTP := TidHTTP.Create(nil);
HTTP.ProtocolVersion:=pv1_1;
HTTP.HandleRedirects:=True;
HTTP.AllowCookies:=true;
HTTP.Request.UserAgent:='Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36';
HTTP.Request.Accept := 'text/javascript, text/html, application/xml, text/xml, */*';
HTTP.Request.ContentType := 'application/x-www-form-urlencoded; charset=UTF-8';
HTTP.RedirectMaximum:= 15;
HTTP.ConnectTimeout := 15000;
HTTP.ReadTimeout := 15000;
HTTP.Request.ContentLength := -1;
HTTP.Request.ContentRangeEnd := -1;
HTTP.Request.ContentRangeInstanceLength := -1;
HTTP.Request.ContentRangeStart := -1;
end;
function TLogowanie.zaloguj();
begin
HTTP.POST(strona, zmienne);
result:= True;
end;
function TLogowanie.wyloguj();
begin
HTTP.GET(strona);
end;
function TLogowanie.Wyslij(link : string) : string;
var
tresc : string;
begin
tresc := HTTP.Get(link);
result := tresc;
end;
destructor TLogowanie.Free();
begin
HTTP.Free;
end;
Program łączy się na kilka stron i ma około 15 minut przerwy i robi wszystko od początku. Dziwne jest to że program potrafi działać bez zawieszenia jakieś 10 godzin a później zawiesić się trzy razy w ciągu godziny. Zawiesza się HTTP.GET
lub HTTP.POST
. Nie wykonuje się kod który dalej w klasie i w wątku. Mogę stworzyć osobny wątek, który co parę minut sprawdza czy pierwszy wątek się nie zawiesił i w razie potrzeby wywalić go i włączyć od nowa ale to raczej nie jest najlepsze rozwiązanie. Dlaczego tak się dzieje? Jest coś co mogę ustawić w HTTP żeby tego uniknąć? Gdyby chociaż wywalało błąd i szło dalej.