19. februar 2004 - 12:36Der er
17 kommentarer og 1 løsning
Flere tråde(objekter
Hej
Jeg skal lave mange (100+) forsp. til en php siden inden for eet minut. jeg forstiller mig jeg kan bruge noget alá idhhtp.get('blabla.pgp?XXX') (det eneste der er forskelligt i mine forsp er XXXX) og vente på svar og dekode mit svar.
Men nu da jeg skal bruge så mange kan jeg jo ikke vente på at webserveren skal svare mig 100 gange, en ventetid på >1 sek vil jo gøre at jeg ikke kan få svar inden for et minut på sidste forsp.
Mit spørgsmål er nu. Kan jeg ikke bare lave et nyt objekt, hver gang jeg vil have en forsp. afsted. Resultatet skal i en DB, det kan jeg gøre i Objektet, inden jeg destructer det ingen.
-og i givet fald: Kan jeg lave en klasse der som input param tager XXX. og så dynamisk lave det antal klasser der er nødvendigt for at kunne afvikle mine forsp. inden for 1 min.
Eller er jeg helt i skoven. -i givet fald, HJÆÆÆÆÆÆÆÆLP
Start med at skrive dig en klasse der kan gøre det du vil ... der er lige et par regler :
1) Den må ikke bruge noget UDEN for sin sig selv. Altså ALT sættes op med properties ude fra, når den bliver lavet! 2) Du må ikke i constructoren sætte handlingen i gang ... det skal være en metode for sig selv !!!!
1) Din klasse skal arve fra TThread ! 2) I din constructor Skriver du FreeOnTerminate := true Det betyder at du ikke den selv nedlægger sigselv når den er færdig. 3) Den metode der styrer det hele skal du kalde Execute ..
type THest = class(TThread) protected procedure Execute; override; end;
procedure THest.Execute; begin Hest skal du udføre alt dit kode .... DU MÅ IKKE KALDE INHERITED. Når denne procedure er færdig TERMINERER din tråd !! end;
Jeg har lavet en constructor der hedder: procedure TGetPlayer.Create(CreateSuspended: Boolean ); begin inherited Create(CreateSuspended); FreeOnTerminate := true; end;
Jeg har i min "main" lavet en stringlist med alle de "XXX" jeg ønsker at kalde.
Det jeg gør nu er:
for index:=0 to count do begin Memo1.Lines.Objects[index] := TGetplayer.create(FALSE); (Memo1.Lines.Objects[index] as TGetplayer).PlayerIDnr:= ADOQuery1['xxx']; end;
Men når jeg skriver til PlayerIDnr i min tråd får jeg enfejl (47): This form of method call only allowed for class methods ???
Jeg har en form med en knap, det er min "main" form (Tform1). Der er her jeg forstillede mig at jeg skulle oprette et antal tråde af min klasse TGetPlayer.
Min for-løkke der skal oprette det antal tråde jeg nu har brug for skal vel ikke ligge i en tråd?
Sorry det er allerede når jeg i min TForm1 forsøger at create en instans af min klasse TGetPlayer (som har arvet fra TThread) at min fejl kommer. Denne fejl er først kommet efter jeg har ændret i constructoren i TGetPlayer, før fik jeg en fejl (access violation) når jeg forsøgte at skrive til min property (PlayerIDnr) i min instans af TGetplayer
type TForm1 = class(TForm) Memo1: TMemo; Edit1: TEdit; Button1: TButton; ADOConnection1: TADOConnection; ADOQuery1: TADOQuery; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end;
var Form1: TForm1;
implementation
uses Unit2;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject); var index: integer; begin
ADOQuery1.SQL.Clear; ADOQuery1.SQL.Add('Select * from ppo where State = 0'); ADOQuery1.Active:=TRUE; for index:= 0 to ADOQuery1.RecordCount-1 do begin Memo1.Lines.Add(inttostr(ADOQuery1['playerID'])); Memo1.Lines.Objects[index] := TGetplayer.create(FALSE); (Memo1.Lines.Objects[index] as TGetplayer).PlayerIDnr:= ADOQuery1['playerID']; end;
Hurtigt gæt : procedure TForm1.Button1Click(Sender: TObject); var index: integer; begin
ADOQuery1.SQL.Clear; ADOQuery1.SQL.Add('Select * from ppo where State = 0'); ADOQuery1.Active:=TRUE; for index:= 0 to ADOQuery1.RecordCount-1 do begin Memo1.Lines.Add(inttostr(ADOQuery1['playerID'])); Memo1.Lines.Objects[index] := TGetplayer.create(TRUE); with (Memo1.Lines.Objects[index] as TGetplayer) do begin PlayerIDnr:= ADOQuery1['playerID']; Resume; end; end; end;
Jeg har lavet et nyt projekt der kun lige koncentrere sig om denne Access Violation må jeg maile dette projekt til dig ? (Og andre der måtte ønske det) Så kan du prøve at køre det lokalt.
Det ser ud at til det ikke er tilladt at linke imellem Memo'er og tråde..
Hvis jeg istedet anvender TStringlist har jeg ikke noget problem.
Jeg lukker og slukker.
Tak for hjælpen Jens B
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.