IdHTTP + watek + crash

0

Mam taki mały problem... zrobiłem program który tworzy watek i w nim obiekt TIdHTTP który ma obsługiwać połączenie z internetem. Wszystko ładnie pięknie śmiga do czasu. W pewnym momencie po prostu watek sie zakańcza. Aplikacja sama w sobie działa dalej bo watek tylko pobierał z niej dane i ew zapisywał z powrotem. procedura pobierająca dane z internetu:

function TObslugaHTTP.Get(adres: string): string;
var
  OutPut : TStringStream;
begin
  Output := TStringStream.Create('');
  try
    idhttp1.Get(adres, Output);
    Result:=output.DataString;
  finally
    Output.Free;
end;
end;

chyba dosyć przejrzyście. Ale czasem przecież występują takie problemy jak out of time albo http 408 czy jakoś tak. Wtedy przez obiekt idhttp watek sam sie zakańcza. Nie wiem jak zrobić żeby obsłużył odpowiednio to zdarzenie. Ew mógłbym po wysypaniu sie wątku zrobić jeszcze jeden i ponowne połączenie nawiązać ale konstruktor już nie chce zadziałać na tej zmiennej. Nie jestem specjalista może to proste rozwiązanie jest ale mi nic nie przychodzi do głowy. Faktem jest ze pisze sobie pare bibliotek maxymalnie uproszczających mi prace z internetem.

Z gory dzieki za odpowiedz :-)

czy nikt nie wie jak to zrobić?

0

pokaż mi jak wygląda zdarzenie wątku OnExecute i/lub constructor Create... tam tkwi problem...

0
procedure TWatek.Execute;
begin
FPrzekaz:=TStringList.Create;
FreeOnTerminate:=true;
HTTP1:=TObslugaHTTP.Create(FForm);
rich1:=TStringList.Create;
rich2:=TStringList.Create;
rich3:=TStringList.Create; 
rich4:=TStringList.Create;
rich5:=TStringList.Create;
while not (Application.Terminated) or (Terminated) do
  begin
  sleep(5000);
  if FAttack then
  zaatakuj;
  if FLogging then
  zaloguj;
  end;
end;

i deklaracja zmiennych:

  private
    rich1:TStringList;
    rich2:TStringList;
    rich3:TStringList;
    rich4:TStringList;   
    rich5:TStringList;
    int1:integer;
    int2:integer;
    int3:integer;
    str1:string;  
    str2:string;
    str3:string;
    FPrzekaz:TStringList;
    FAttack:boolean;
    FLogging:boolean;
    FServer:string;
    FParams:string;
    FLogin:string;
    FPassword:string;
    FForm:TForm;
    HTTP1:TObslugaHTTP;
    Szukajka:TSzukajka2;

no tyle mam w moim programie a w klasie do obslugi INDY:

type

  TObslugaHTTP = class
  public
    idhttp1:TidHTTP;
    idCookieManager1:TIdCookieManager;
    constructor Create(OBiekt:TComponent);
    function Get (adres:string):string;
    function Post (adres, co:string):string;
  end;

constructor TObslugaHTTP.Create(OBiekt:TComponent);
begin
   idhttp1:=TIdHTTP.Create(OBiekt);
   idCookieManager1:=TIdCookieManager.Create(OBiekt);
   idhttp1.HandleRedirects:=true;
   idhttp1.CookieManager:=idCookieManager1;
   idhttp1.Host:='www.emokillers.fora.pl';
   idhttp1.Request.Accept:='application/xhtml+voice+xml;version=1.2, application'+
   '/x-xhtml+voice+xml;version=1.2, text/html, application/xml;q=0.9, application'+
   '/xhtml+xml, image/png, image/jpeg,image/gif, image/x-xbitmap, */*;q=0.1';
   idhttp1.Request.AcceptLanguage:='pl,en;q=0.9';
   idhttp1.Request.AcceptCharSet:='iso-8859-1, utf-8, utf-16, *;q=0.1';
   //idhttp1.Request.AcceptEncoding:='deflate, gzip, x-gzip, identity, *;q=0,*.*';
   idhttp1.Request.ContentType:='application/x-www-form-urlencoded';
   idhttp1.Request.Connection:='Keep-Alive, TE';
end;

function TObslugaHTTP.Get(adres: string): string;
var
  OutPut : TStringStream;
begin
  Output := TStringStream.Create('');
  try
    idhttp1.Get(adres, Output);
    Result:=output.DataString;
  finally
    Output.Free;
end;
end;

function TObslugaHTTP.Post(adres, co: string): string;
var
  Output, Input : TstringStream;
begin
  Output := TStringStream.Create('');
  input := TStringStream.Create('');
  input.WriteString(co);
  try
    idhttp1.Post(adres, Input, Output);
    result := Output.DataString;
  finally
    Output.Free;
    Input.Free;
  end;
end;

no to jest chyba wszystko co ma cokolwiek wspolnego z obsluga internetu w moim programie. Korzystam z Turbo Delphi z jednego wzgledu... legalnosc softu. Nie stac mnie na inne wersje jeszcze wiec niestety ale amiana kompilatora odpada.

Dodam ze synchronizacje mam w programie na jaknajlepszym porzadku i nie ma z nia problemow. Problem pojawia sie wewnatrz watku :/ I nie mam pojecia czy watek moze sam sie wylaczyc po otrzymaniu bledu w komponencie TIdHTTP? Jesli nie to szukac bledu bede musial gdzies indziej...

0

nie pokazałeś najważniejszego czyli:

zaatakuj;

i

zaloguj;

0

Jeśli dasz OnTerminate := True to nie ma się co dziwić że się wyłącza. Natomiast co do obsłużenia błędów, możesz spróbować zacząć od tego że w pętli (w Execute) obejmik kod klauzulą try kod except;end; czyli stłum wyjątek, zobaczysz czy wtedy się będzie wywalał (chociaż z obsługą wyjątków z wątkach bywa różniaście ...)

0

juz sobie poradzilem ale i tak dzieki za odpowiedzi ;)
Na przyszlosc dla innych informuje ze komponent IdHTTP jesli napotka blad w czasie wykonywania to nie zakancza watku. Problem byl gdzies indziej a ja szukalem w zlym miejscu.
Chodzilo o to ze program zle parsowal zrodlo strony i kiedy stona nie zostala sciagnieta to program zaczynal parsowac puste pola. Juz to naprawilem i wszystko jest cacy ;)

jakby nie bylo to robie sobie klienta dodatkowego dla siebie :D a nie zadne chackierskie softy

1 użytkowników online, w tym zalogowanych: 0, gości: 1