Thread-ovi i GLScene ?

Thread-ovi i GLScene ?

offline
  • Pridružio: 03 Jan 2006
  • Poruke: 37

Pozdrav,ako sam omasio forum,nemojte molim vas obristi temu,
nego je samo premestite u odgovarujuci forum,hvala unapred! Smile
Ovako,o GLScenama pricam. Smile
Postavio sam jedan HUDText,i napisao sam jedan thread koji menja HUDText-u boju postepenno kroz while petlju.
Zatim sam napisao jos jedan thread koji kontrolise kretanje sfere.E meni bi
trebalo da se menja boja i da se pokrece sfera u isto vreme.Dok kod mene ili se menja boja HUDText-a
ili se pokrece sfera(dok opet ne pozovem thread da mi promeni boju).Kako da uskladim da se odradi i jedan i drugi
posao,tj da se ne zamrzne nijedna radnja(ni kretanje sfere,ni menjanje boje HUDText-a) Smile
Nadam se da sam bio jasan!

P.S. Slabo znam da radim sa thread-ovima. Sad
Hvala,pozzz!



Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
offline
  • Srđan Tot
  • Am I evil? I am man, yes I am.
  • Pridružio: 12 Jul 2005
  • Poruke: 2483
  • Gde živiš: Ljubljana

Ako bi postavio kod verovatno bi mogli da vidimo u cemu je problem Smile

Imaj na umu da GLScene komponente nisu thread-safe pa ako koristis TThread klasu koristi Synhronize proceduru za menjanje svojstva kontrola.



offline
  • Pridružio: 03 Jan 2006
  • Poruke: 37

Da,da naravno!
Ovo je jedan Thread :
. . .  type  Tird = class(TThread)  private  {}  protected  {}  procedure UpdateText;  procedure Execute; override; end; implementation uses Unit1; procedure Tird.UpdateText; var  I : Single; begin I:=0.00;  while I <= 1.00 do   begin    Form1.GLHUDText1.ModulateColor.Alpha :=I;    Form1.Caption := FloatToStr(I);    Application.ProcessMessages;    Sleep(50);    I:=I+0.01;   end; end; procedure Tird.Execute; begin   Synchronize(UpdateText); end; . . .

Ovo je drugi :
type  Tirdovi = class(TThread)  private  {}  protected  {}  procedure UpdateStars;  procedure Execute; override; end; implementation uses Unit1,GLBehaviours; procedure Tirdovi.UpdateStars; var  Inercija : TGLBInertia; begin  Inercija := GetOrCreateInertia(Unit1.Form1.GLSkyDome1);  Inercija.PitchSpeed := 5.0;  Form1.GLSceneViewer1.Invalidate;  Application.ProcessMessages; end; procedure Tirdovi.Execute; begin   Synchronize(UpdateStars); end;

Hvala,pozdrav

Dopuna: 25 Maj 2006 12:23

Ovaj oko inercije sam pozivao na FormCreate a ovaj oko boje na btnClick.

Dopuna: 25 Maj 2006 12:26

Ovako sam ih pozivao,samo drugi ime za svaki Thread :
 MojTird := Tird.Create(True);  MojTird.FreeOnTerminate := True;  MojTird.Resume;

Dopuna: 25 Maj 2006 12:27

Jos jedna dopuna Smile
Hvala,pozdrav!

offline
  • Srđan Tot
  • Am I evil? I am man, yes I am.
  • Pridružio: 12 Jul 2005
  • Poruke: 2483
  • Gde živiš: Ljubljana

type   Tird = class(TThread)   private     {}   protected     {}     I : Single;     procedure UpdateText;     procedure Execute; override;   end; implementation uses Unit1; procedure Tird.UpdateText; begin    Form1.GLHUDText1.ModulateColor.Alpha :=I;    Form1.Caption := FloatToStr(I); end; procedure Tird.Execute; begin   I := 0.00;   while not Terminated do   begin     Synchronize(UpdateText);     Sleep(50);     I:=I+0.01;     if I > 1 then I := 0;   end; end;

uses   GLBehaviours; type   Tirdovi = class(TThread)   private     {}   protected     {}     Inercija : TGLBInertia;     procedure UpdateStars;     procedure Execute; override;   end; implementation uses Unit1; procedure Tirdovi.UpdateStars; begin  Inercija.PitchSpeed := 5.0; end; procedure Tirdovi.Execute; begin   Inercija := GetOrCreateInertia(Unit1.Form1.GLSkyDome1);   while not Terminated do   begin     Synchronize(UpdateStars);   end; end;

U OnCadencer eventu pozivaj Invalidate za SceneViewer.

Oba thread-a kreiraj na pocetku (OnCreate forme) i vise ne treba da mislis na njih. Ako hoces da ih zaustavis samo napisi MojTird.Terminated := True;

Ovo sam pisao iz glave pa ce mozda imati neku gresku.

offline
  • Pridružio: 03 Jan 2006
  • Poruke: 37

OK,hvala,sad cu pogledam,bitna mi je ideja,kako od prilike.Hvala,pozzz

Dopuna: 25 Maj 2006 13:53

Malo sam prepravio ovo sa kretanjem,jer je kocilo :
procedure Tirdovi.UpdateStars; begin  Inercija := GetOrCreateInertia(Unit1.Form1.GLSkyDome1);  Inercija.PitchSpeed := 15.0; end; procedure Tirdovi.Execute; begin  Synchronize(UpdateStars); end;

Jos jedno pitanje,mozemo li mi da zaustavimo Thread na ovako neki slican nacin,ili to radimo samo iz glavnog unit-a(Thread-a):
while not Terminated do  begin  .... neka promenjiva I sto se uvecava   if I=nesto then zaustavi Thread;  end;
Pozz

offline
  • Srđan Tot
  • Am I evil? I am man, yes I am.
  • Pridružio: 12 Jul 2005
  • Poruke: 2483
  • Gde živiš: Ljubljana

Thread se vrti sve dok je Terminated False... bilo gde postavi Terminated na True i thread ce lepo da se zaustavi:

while not Terminated do  begin  .... neka promenjiva I sto se uvecava   if I=nesto then Terminated := True;  end;

Dopuna: 25 Maj 2006 19:41

Samo jedno pitanje... zbog cega si koristio thread-ove za ovo?

offline
  • Pridružio: 03 Jan 2006
  • Poruke: 37

Pa neznam,kocila mi slika posto se menjala boja slova,i pokretala mi se pozadina,pa sam pomislio da je resenje sa tirdovima.I sad sve lepo fino radi.Pokrece se i pozadina i menja se boja.
Pozdrav!

offline
  • Srđan Tot
  • Am I evil? I am man, yes I am.
  • Pridružio: 12 Jul 2005
  • Poruke: 2483
  • Gde živiš: Ljubljana

Ne znam koliko je pametno da pravis thread za svaki objekat koji se nekako menja (pozicija, materijal ili neke druge osobine). Ako imas neku vecu scenu sa par stotina objekata koje treba menjati, mozda ti kod cak i sporije radi sa thread-ovima.

Da li si razmisljao da uradis kod ovako?
https://www.mycity.rs/must-login.png

offline
  • Pridružio: 03 Jan 2006
  • Poruke: 37

E od sad cu da razmisljam i tako da radim. Smile
Hvala Srdjane,pozzzz

Ko je trenutno na forumu
 

Ukupno su 561 korisnika na forumu :: 41 registrovanih, 10 sakrivenih i 510 gosta   ::   [ Administrator ] [ Supermoderator ] [ Moderator ] :: Detaljnije

Najviše korisnika na forumu ikad bilo je 3028 - dana 22 Nov 2019 07:47

Korisnici koji su trenutno na forumu:
Korisnici trenutno na forumu: _Sale, A.R.Chafee.Jr., atrkulja, axa, babaroga, blue, BOKIII, cavatina, cikadeda, dedalus2, DM1994, dragisa dragisa, goxin, hak1, Krstić, Krusarac, Kubovac, MarKhan, Marko Marković2, Markoni29, Mercury, Mirage 2000N, Mixelotti, mrav pesadinac, nikoladgajic, Parker2, powSrb, Recce, RegrutGruja, SAA fan, Sale.S, saputnik plavetnila, Shomy, trajkoni018, V.P., vasa.93, vladas87, vladetije, vlvl, vojnik xxx, W123