Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Vezivanje rekurzije na thread...

[es] :: .NET :: Vezivanje rekurzije na thread...

[ Pregleda: 2294 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

ntadic
bg

Član broj: 38173
Poruke: 75
217.26.75.*

ICQ: 317199697


Profil

icon Vezivanje rekurzije na thread...25.07.2005. u 12:22 - pre 228 meseci
Prije par dana mi je zatrebalo da rekurzivnu metodu nakachim na thread.

I nisam uspio da to uradim, jer konstruktor klase ThreadStart prima kao parametar samo void metode bez parametara (a moja metoda naravno ima parametre). Kasnije sam petljao sa delegatima i BeginInvoke metodom forme u kojoj se sve ovo desava, i opet nista (BeginInvoke nije prosledjivala parametre mojoj metodi).


Ideas?
I tako...
 
Odgovor na temu

dusty
Predrag Glumac
Zemun, Srbija

Član broj: 15383
Poruke: 549
82.117.193.*

Sajt: www.mika.rs


+6 Profil

icon Re: Vezivanje rekurzije na thread...25.07.2005. u 12:38 - pre 228 meseci
Znaci, BeginInvoke pozove tu metodu ali ne prenosi argumente u Object[] parametar ?
Cudno ?! Da bacis ovde metodu koja poziva BeginInvoke.

BTW ako sam ja dobro ukapirao, na ovaj nacin hoces pri svakoj rekurziji da pravis novi thread. Ja bih za to koristio thread pool.
America national sport is called baseballs. It very similar to our sport, shurik, where we take dogs, shoot them in a field and then have a party.
 
Odgovor na temu

ntadic
bg

Član broj: 38173
Poruke: 75
217.26.75.*

ICQ: 317199697


Profil

icon Re: Vezivanje rekurzije na thread...25.07.2005. u 15:55 - pre 228 meseci

koliko sam ja ukapirao BeginInvoke sluzi za pozivanje metode iz drugog thread-a

pa sam napravio metodu tipa


void xy( )
{

frmMain.BeginInvoke(Rekurzija, new object[] {new TreeNode ("Nebitan string")});

}


Ali koliko sam primjetio on je izvrsi, valjda samo prvi put, dok kad sama sebe poziva "corak"!!!

Mislim da bi mozda rijesio problem kada bi i rekurzivna metoda pozivala sama sebe sa BeginInvoke. Ali onda nisam postigao cilj tj. da mi rekurzivna metoda bude na thread-u koji ja instanciram.

Ako neko ima vremena neka pokusa da veze bilo kakvu rekurzivnu metodu na thread npr:
Faktorijel:


private int faktorijel(int n, int i)
{
if (i == n) return n;
else return i*faktorijel(n, i+1);
}

Funkciju pozivas sa faktorijel(n,1);

I tako...
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: Vezivanje rekurzije na thread...26.07.2005. u 12:20 - pre 228 meseci
Form.BeginInvoke ne sluzi u svrhu za koju je ti koristis.

Taj metod sluzi da se odredjeni metod (delegat) izvrsi u threadu u kome se izvrsava sam form. Ovo je bitno zato sto po dizajnu klase koje nasledjuju Control nisu thread-safe i ako npr. pokusas da promenis boju neke kontrole na formi van thread-a same forme dolazi do nepredvidivih rezultata.

Primena za ovu metodu je npr. ako imas worker thread koji radi neki task u pozadini i hoces da se na glavnoj formi iscrtava procenat dokle je worker thread stigao. Onda se iz worker thread-a u intervalima poziva BeginInvoke metod i prosledjuje mu se procenat, a u delegatu se progress bar postavi na taj procenat...

Da bi ti neki task pokrenuo u drugom threadu, ili instanciras objekat System.Threading.Thread ili predas task ThreadPool-u (iz istog namespace-a).

Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

ntadic
bg

Član broj: 38173
Poruke: 75
217.26.75.*

ICQ: 317199697


Profil

icon Re: Vezivanje rekurzije na thread...26.07.2005. u 14:41 - pre 228 meseci
Ok mmix, znači, bar sam riješio BeginInvoke dilemu.
On mi definitivno ne treba u ovom slučaju.

E sad kako mogu da vežem navedenu, rekurzivnu, metodu na thread koji sam instanciram.
I tako...
 
Odgovor na temu

dusty
Predrag Glumac
Zemun, Srbija

Član broj: 15383
Poruke: 549
213.137.127.*

Sajt: www.mika.rs


+6 Profil

icon Re: Vezivanje rekurzije na thread...26.07.2005. u 18:54 - pre 228 meseci
Zapravo treba ti BeginInvoke Ali te ne treba BeginInvoke od Form klase, zbog onog sta je mmix naveo.
Treba da napravis delegat na kome ces pozvati BeginInvoke metodu, koja ce da se izvrsava u jednom threadu iz thread pool-a. Kompajler za svaki delegat generise metode za asinhrone pozive: BeginInvoke i EndInvoke.

Code:

private delegate int DelegateFaktorijel(int n, int i);
private DelegateFaktorijel asyncFaktorijel;
.
.
//metoda za pokretanje thread-a
asyncFaktorijel = new DelegateFaktorijel(faktorijel);
asyncFaktorijel.BeginInvoke(n, 1, null, null);        // treba staviti
                      //callback metodu koja ce pozvati EndInvoke i uzeti rezultat


Pogledaj po MSDN-u, mislim da ima i primera.
America national sport is called baseballs. It very similar to our sport, shurik, where we take dogs, shoot them in a field and then have a party.
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: Vezivanje rekurzije na thread...27.07.2005. u 15:02 - pre 228 meseci
Samo kao dopuna,
asinhroni delegati koriste ThreadPool.QueueUserWorkItem, medjutim da bi informacija bila predata handleru, asinhroni BeginInvoke koristi refleksiju nad definicijom delegata da kreira in-memory assembly sa klasom koja ce nositi rezultat i parametre poziva. Onda kreira wrapper oko handlera i opet koristi refleksiju da prenese parametre u thread (preko state parametra u QueueUserWorkItem) i pozove tvoj delegat na kraju iz svog wrappera koji vec radi u drugom threadu, onda na kraju ThreadPool uradi callback u delegat da je thread gotov; i na samom kraju delegat refleksijom izvuce rezultat i pozove tvoj callback sa IAsyncResult.

Mislim da je mnogo efikasnije zaobici refleksiju i sam napraviti malu klasu u nju potrpati paramtere, alocirati polje za rezultat i sam pozvati QueueWorkItem. Na kraju QueueWorkItem hendlera pozvati nazad metod na formi sa Form.BeginInvoke da se javi da je rezultat gotov.

Ima malo vise koda, ali je mnogo efikasnije ako se pokrece dosta worker threadova, posto se refleksija uopste ne koristi i nema dvostrukog callback-a. Sa druge strane asinhroni delegati imaju malcice manje koda. Sad ti vidi sta ti vise odgovara.


Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

[es] :: .NET :: Vezivanje rekurzije na thread...

[ Pregleda: 2294 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.