Witam. Piszę program w Delphi XE8, który będzie logował się na jedną stronę i wykonywał kilka różnych czynności. Chciałem żeby każda z tych czynności była wykonywana niezależnie więc postanowiłem zrobić to w wątkach. Każdy wątek potrzebuje zalogować się na stronę. Logowanie jest trochę uciążliwe i długie więc stworzyłem klasę, nazwałem ją HTTP i zapisałem w osobnym pliku *.pas
Każdy wątek tworzy klasę HTTP, odwołuje się do dwóch funkcji tej klasy, logowania i wysłania zmiennych na konkretną podstronę.
Wszystko ładnie działa dopóki aktywny jest tylko jeden wątek. Gdy aktywuję trzy wątki, dwa z nich nie mogą się zalogować.
Klasa nie korzysta z żadnych wizualnych komponentów i jest w osobnym pliku. Każdy wątek również jest w osobnym pliku i w uses ma dodany HTTP aby ładować sobie klasę. Myślałem że to skutecznie usamodzielni wątki.
I tu moje pytania. Czy kilka wątków może używać jednej klasy? Jeżeli nie to jak to rozwiązać?
Wątek w uproszczeniu:
uses
System.Classes, System.SysUtils, System.StrUtils, Farma, HTTP, INIFiles, Vcl.Forms;
type
TWatek = class(TThread)
private
zmienna1 : string;
zmienna2 : string;
protected
procedure Execute; override;
public
constructor Create(tzmienn1, tzmienna2: string);
end;
implementation
constructor TWatek.Create(tzmienna1, tzmienna2: string);
begin
self.zmienna1 := tzmienna1;
self.zmienna2 := tzmienna2;
end;
procedure TWatek.Execute;
var
HTTP : THTTP; //Moja klasa
begin
FreeOnTerminate := True;
HTTP := THTTP.create();
HTTP.loguj();
HTTP.wyslij(link);
HTTP.free;
exit;
Klasa w uproszczeniu
uses
idHTTP, System.Classes, System.SysUtils, System.StrUtils, INIFiles, Vcl.Forms;
type THTTP = class
rid : string;
function Loguj() : boolean;
function Wyslij(link : string) : string; overload;
function Wyslij(link : string; parametry : string): string; overload;
private
HTTP : TidHTTP;
host : string;
public
constructor Create();
destructor Free();
end;
implementation
function DateTimeToUNIXTimeFAST(DelphiTime : TDateTime): LongWord;
begin
Result := Round((DelphiTime - 25569) * 86400);
end;
constructor THTTP.Create;
begin
self.HTTP := TidHTTP.Create(nil);
HTTP.ProtocolVersion:=pv1_1;
HTTP.HandleRedirects:=True;
end;
function THTTP.Loguj() : boolean;
var
Parametry: TStringList;
HTML, data, zmienne: String;
start, koniec : integer;
INI : TINIFile;
login, haslo : string;
begin
//Tu jest masa kodu odpowiedzialnego za logowanie
if zalogowany = true then
result := true
else
result := false
exit;