[ erkan @ 07.09.2004. 15:44 ] @
Pozdrav svima, imam problem pa bih bio zahvalan na svakom korisnom savjetu.

U jednoj aplikaciji (DCOM server) prvobitno rjesenje
visenitnog rada je bilo relizovano koristenjem Timer-a. To mi se nije dopalo jer
u slucaju zastoja (recimo prilikom lose konekcije sa bazom) svi Timeri bi
stali. Tako da sam neke od Timera zamjenio Thread-ovima (iako sam mislio da su isto), ispostavilo se da Thread-ovi nastavljaju da rade bez problema u slucaju zastoja (za razliku od Timer-a).
Medjutim, u jednom od novonastalih tredova se pozivao i jedan Timer
(SetTimer(...)) koji nikada nije izvrsio funkciju koja je naznacena tj. nikada ne dolazi do nje. Taj problem je takodje rijesen tako sto sam zamjenio taj problematicni timer sa Thread-om i nastavilo je sa radom bez problema.
--------------------
Problem je u tome sto u aplikaciji (a projekat je dosta slozen po mom misljenju) ima jos nekakvih timera (10-ak) i tako da su se javili i ostali problemi, npr gubljenje TCP konekcije sa jednim serverom, iznenadno iskljucivanje kompletne aplikacije (nakon visesatnog rada) itd...
--------------------

Moze li mi neko reci koja je razlika izmedju Thread-a i Timer-a, i da li postoji neki
problem u njihovoj medjusobnoj interakciji, jer se na mom programu tako ispostavilo,
da li je zamjena svih Timera sa Thread-ovima pravo rjesenje (jer je ostalo jos njih zbog kojih smatram da je i doslo do gor navedenih problema...)


Hvala
[ erkan @ 07.09.2004. 15:53 ] @
Jos jedno pitanje ako moze?! :)
Da li se iz vise razlicitih Thread-ova moze pozivati jedna ista fja
i sta se u tom trenutku desava
[ Dragi Tata @ 07.09.2004. 16:43 ] @
Timer (bar onaj koji se postavlja sa SetTimer) jednostavno pošalje WM_TIMER poruku u message queue niti. WM_TIMER ima nizak prioritet, pa je vrlo nezahvalno prognozirati kad će se pozvati funkcija koja obrađuje odgovor na tajmer. Sa druge strane, ako (iz jedne niti) setuješ više tajmera, siguran si da će se funkcije koje obrađuju odgovor na tajmer izvršavati sekvencijalno i nećeš morati da razmišljaš o sinhronizaciji.

Imaš i drugih vrsta tajmera (npr, multimedijalni) koji opale posebnu nit u kojoj se izvršava odgovor na tajmer. Ovakvi tajmeri su mnogo precizniji, ali i opasniji, jer moraš da vodiš računa o sinhronizaciji niti.
[ milanche @ 07.09.2004. 18:38 ] @
Odgovor na tvoje drugo pitanje:

Moze li deset ljudi da u isto vreme otvori istu stranicu iz iste knjige recepata i da
napravi isto jelo, prema istom receptu ?

Odgovor: moze, ukoliko recept ne zahteva nesto jako specificno, sto postoji samo u
jednom primerku (na primer, jaje od noja, a u gradu postoji samo jedan noj, koji snosi
jedno jaje godisnje).

Tako je i sa funkcijama koje se zovu iz thread-a. Funkcije koje operisu samo sa svojim
internim promenljivama mogu da se zovu iz neogranicenog broja thread-ova. Naprotiv,
ako funkcija radi sa promenljivama malo sireg scope-a (globalne, staticke, class variables),
onda mora da se obrati paznja na sinhronizaciju. Funkcije ili biblioteke koje
imaju ugradjenu sinhronizaciju se obicno opisuju kao 'thread safe', a obicno su sporije
zbog gubitka vremena na lock-ovanju mutexa (semafora, kriticnih sekcija...)

Na kraju, u Windows okruzenju postoji jos jedno ogranicenje - worker thread ne bi
trebalo da zove ni jednu funkciju koja kontrolise glavni GUI thread. Umesto toga,
trebalo bi da salje poruke (PostMessage( ) ili SendMessage( )) glavnom thread-u.
[ ljube @ 07.09.2004. 22:27 ] @
Kakva je situacija kada u funkciji deklarises varijable kao static?
Da li u tom slucaju moze da dodje do mijesanja podataka kada se ista funkcija poziva iz vise thredova?


[ Dragi Tata @ 07.09.2004. 22:38 ] @
Može.
[ blaza @ 07.09.2004. 23:44 ] @
Jos jedan drawback vezan za WM_TIMER: Postovanje nove WM_TIMER poruke se preskace ako prethodno postovana WM_TIMER poruka nije obradjena.
[ milanche @ 08.09.2004. 06:24 ] @
To moze da ispadne i vrlina - ako koristis multimedia timer, ako program pocne da
kasni sa obradom timer poziva, crash cele aplikacije je neizbezan.
[ erkan @ 08.09.2004. 07:10 ] @
Hvala vam puno,
mislim da ce mi ove informacije pomoci, a ako bude
dodatnih problema -> javljam se ponovo :)
Hvala