19. 02. 2008. | #1 |
Developer
Na probnom radu
Datum učlanjenja: 06.06.2005
Lokacija: Wien
Poruke: 19
Hvala: 0
0 "Hvala" u 0 poruka
|
Problem sa threadom- c#
Imam u programu jednu metodu kojoj je potrebno 10-15 sekundi da odradi neka izracunavanja.Problem je sto korisnik u medjuvremenu treba biti u mogucnosti da koristi program.Naravno stavim tu metodu u poseban thread i kontam gotov problem ali...
Fazon je u tome sto korisnik moze,dok ta metoda vrsi izracunavanje, pozove tu istu metodu sa novim podacima.I sad ja trebam nekako trenutno taj thread prvobitni zaustviti i pokrenuti novi.Sa Abort() nazalost ne radi kako treba. Ima l neko neki prijedlog? Thx. |
19. 02. 2008. | #2 |
Dejan Grujic
Professional
Datum učlanjenja: 29.09.2005
Poruke: 380
Hvala: 9
64 "Hvala" u 40 poruka
|
Standardno resenje je da ta tvoja rutina redovno (npr. u svakom prolazu petlje) proverava neku boolean promenljivu i kad je neko postavi na false da prekine to sto radi. Glavni problem je ako imas duzu IO operaciju, onda nema prekida pre nego sto se ona zavrsi. Tu mozes da probas da zatvaras konekciju iz drugog thread-a i slicno, zavisno sta ti je ta IO operacija.
|
19. 02. 2008. | #3 |
Developer
Na probnom radu
Datum učlanjenja: 06.06.2005
Lokacija: Wien
Poruke: 19
Hvala: 0
0 "Hvala" u 0 poruka
|
Tako sam ja u sustini i uradio,ali upravo je taj problem sto ne moze trenutno prekinuti thread pa baca exception.Kada sam obradio taj exception sve je ok,ali mislim da je to potecijalno mjesto za probleme u buducnosti.
|
19. 02. 2008. | #4 |
profesionalac
Professional
|
Sinoc sam bas citao o Nitima u c# jeziku. Koliko sam razumeo dok ti je aktivna jedna nit druga dobije procesor i pozove istu metodu, tj ima pristup promenjivana i napravi zbrku.
Kôd:
lock (x) { //RadiNesto(); } Poslednja izmena od Djuki : 19. 02. 2008. u 13:05. |
19. 02. 2008. | #5 |
član
Certified
Datum učlanjenja: 03.10.2006
Poruke: 96
Hvala: 27
44 "Hvala" u 26 poruka
|
Ukratko:
Ako se metoda poziva sa NOVIM podacima resenje je uvek sledece: Kreira se NOVA nit! Uvek! Sinhronizacija ti ne treba! To su dva nezavisna posla i nema veze sto ih radi ista metoda! Nikakvo zaustavljanje ti ne treba! Ovo znaci da imas metodu: retObj DoSmth(Obj args) Fora je da svaki put kreiras novu nit (ali cije je telo ista metoda u kojoj se poziva DoSmth) kad korisnik to zahteva! Konkurencija ti treba samo pri ispisu/upisu izracunatih stvari negde. Na osnovu tvog opisa samo tako ima smisla koristiti threadove. SINHORNIZACIJA (lock) je potrebna kad se pristupa istim podacima. Ako se to ne radi sinhronizacija nema smisla Na osnovu tvog opisa to je jedino sto ti treba - svaki put nova nit koja kad zavrsi posao - umre kako se to strucno kaze! Poslednja izmena od djipko : 19. 02. 2008. u 13:30. |
19. 02. 2008. | #6 |
Dejan Grujic
Professional
Datum učlanjenja: 29.09.2005
Poruke: 380
Hvala: 9
64 "Hvala" u 40 poruka
|
|
19. 02. 2008. | #7 | |
član
Certified
Datum učlanjenja: 03.10.2006
Poruke: 96
Hvala: 27
44 "Hvala" u 26 poruka
|
Citat:
Ako dva threada treba da izvrse istu rutinu nad razlicitim podacima nema nikakvog smisla zaustavljati jedan dok drugi ne zavrsi - jer oni nisu medjusobno zavisni. Zasto kod nije deljeni resurs mislim da ne treba objasnjavati. Ako pak ta rutina radi nad istim podacima, a u pitanju je citanje tih podataka bez izmene - opet nema smisla bilo kakva sinhronizacija - pod uslovom da ih neki drugo thread ne menja. Ako ima izmene podataka - koristi se klasican lock-mutex-critical section mehanizam koji pod razlicitim nazivima postoji u svakom programskom jeziku koji podrzava multithreading (ili multithreading bilioteka ih ima uvek). Mislim da je problem koji kolega ima ne razumevanje rada sa tredovima u potpunosti... Naravno mozda ja nisam razumeo nesto... Poslednja izmena od djipko : 19. 02. 2008. u 17:27. Razlog: typos |
|
19. 02. 2008. | #8 |
Developer
Na probnom radu
Datum učlanjenja: 06.06.2005
Lokacija: Wien
Poruke: 19
Hvala: 0
0 "Hvala" u 0 poruka
|
Hvala na odgovorima,ali problem je za sada rijesen.
Radilo se o sledecem.Korisnik ima mogucnost da pozove preko gui-a odredjenu metodu.Problem je bio sto se gui zamrzne,dok traju ta izracunavanja.Kada sam stavio tu metodu u poseban thread,sve je radilo ok,osim kad korisnik ponove pozove tu istu metodu.Onda sam ja provjeravao da li je taj thread vec pokrenut,pokusavao ga zaustaviti (jer mi vise nije potreban,a zauzima resurse) i kreirao novi thread. Jedini problem je bio kad korisnik pomahnita i pozove metodu par desetina puta u sekundi.Onda se javaljao InvalidoperationException. |
|
|
Slične teme | ||||
Tema | Početna poruka teme | Forum | Odgovori | Poslednja poruka |
Double float problem - resen, ali ima dodatni problem :0 | ljtruba | (X)HTML, JavaScript, DHTML, XML, CSS | 34 | 23. 08. 2008. 03:28 |