hwfanatic je napisao(la):
Inace, timer-u treba owner, od koga uzima handle i tako to... Osim ako ne znas kako da premostis to. *high hopes*
MojTajmer := TTimer.Create(nil);
:happy:
Taj owner mu treba samo radi kaskadnog 'ubijanja', tj. kada se ubije Owner, da se i sam timer ubije kao njegov child. Mozes da kreiras ovako, samo moras onda explicitno da oslobodis memoriju koju zauzima (kada dodje vreme za ubijanje) sa klasicnim MojTajmer.Free (ili FreeAndNil(MojTajmer) - sasvim svejedno). Ovaj TTimer inace sam obezbedi sebi svoj handle, pa mu owner za to ni ne treba.
Greska sa ovom tvojom klasom je i to sto nisi u Execute metodu sve sto radis uvezao u 'while not terminated' petlju, pa se ne vidi sta i koliko taj thread radi i kada i kako je terminisan. Rad prekidas naravno sa MojTajmer.Terminated := true;
Problem je i malo u tome sto si krenuo da nasledjujes TThread za tajmer koji je jednostavno proces niskog prioriteta. Ako ti treba komunikacija medju threadovima zavisna od nekog taminga (recimo periodicna), neki pravilniji pristup bi bio sledeci:
1. napravi thread klasu, tzv 'radilicu' - to je klasa ciji objekti paralelno izvrsavaju isti tip posla - recimo paralelnu komunikaciju preko socketa sa vise IP adresa
2. napravi thread klasu tzv 'sinhronizator', ciji ce objekat sinhronizovati threadove radilice i davati im potrebne podatke kada sta da urade
3. za komunikaciju medju threadovima ti trebaju definisani eventovi. Ali ne eventovi u smislu metoda klase, nego eventovi kao klase izvedene iz TEvent klase. Ako pratim primer sa ovom komunikacijom, recimo da imam jedan event Heartbeat koji salje svima u mrezi broadcast ping signal (dakle, HeartBeat = class(TEvent)

.
4. uzmi jednu varijablu tipa TTimer.
U tajmeru definisi periodicnost i da kod okidanja daje neki signal sinhronizacionom threadu (recimo inkrement nekog static countera - obicno critical section objekat) kojem ce pristupati samo taj thread radi citanja i na taj nacin ce citanje biti sigurno. Kada taj sinhroni thread utvrdi da je tajmer okinuo jedan podeok (u svojoj Execute proceduri u 'While not terminated' petlji), on okida taj HeartBeat event. Ovi drugi threadovi 'radilice' u svojoj Execute proceduri imaju HeartBeat.WaitFor petlju i kada detektuju da je iz sinhronizacionog threada okinut event, oni ce uraditi ono sta treba (stoji obicno unutar te Heartbeat.Waitfor($FFFFFFFF) = wrSignaled petlje).
Ukoliko ti je potreba za razlicitim eventovima, ti ih definisi i okidaj lepo.