Forum » Programiranje » C# threadanje in gui
C# threadanje in gui
darkkk ::
Ok, problem:
mam (statično) metodo nekega classa, npr:
ki nekaj računa in premetava, povsem neodvisno od UI-ja (dobro, noter se pošlje list string, ven prileti prek out-ov en list string-ov), ampak rad bi:
1. zadevo laufal na drugem threadu:
to naredim z
Zdaj pa vprašanja: kako naredim metode in delegate in kako jih pošljem v funkcijo in kličem iz funkcije da se mi npr. progressBar updejta na gui-ju ?
Načeloma naj bi:
1. naredu metodo, ki updejta ui, tj:
2. naredu delegata na to metodo, to poslal kot parameter v funkcijo ProcessAll
Googlanje mi ne pomaga preveč, ker so vsi primeri blesavi, namreč vse se dogaja znotraj enega classa. Npr: http://www.dreamincode.net/code/snippet...
mam (statično) metodo nekega classa, npr:
C.ProcessAll(List<string> filenames, out List<KeyValuepair<string, C>> msgs, null, null, null);
ki nekaj računa in premetava, povsem neodvisno od UI-ja (dobro, noter se pošlje list string, ven prileti prek out-ov en list string-ov), ampak rad bi:
1. zadevo laufal na drugem threadu:
to naredim z
ThreadStart ts = delegate { C.ProcessAll(files.ToList(), out msgs, null, null, null); }; Thread t = new Thread(ts); t.Start();
Zdaj pa vprašanja: kako naredim metode in delegate in kako jih pošljem v funkcijo in kličem iz funkcije da se mi npr. progressBar updejta na gui-ju ?
Načeloma naj bi:
1. naredu metodo, ki updejta ui, tj:
private void IncrementPb(int nstep) {this.progressBar.Increment(nstep);}
2. naredu delegata na to metodo, to poslal kot parameter v funkcijo ProcessAll
Googlanje mi ne pomaga preveč, ker so vsi primeri blesavi, namreč vse se dogaja znotraj enega classa. Npr: http://www.dreamincode.net/code/snippet...
darkkk ::
Mah resil nekako, vseeno če ma kdo kake guideline:
trenutno
Ampak to mora bit bolj enostavno :P
trenutno
class Form1:Form { private delegate void IntDelegate(int par); private void iPbIncr(int step){ this.Invoke(new IntDelegate(pbIncrement), step); } private void pbIncrement(int step){this.progBar.Increment(nstep);} }
Ampak to mora bit bolj enostavno :P
mihies ::
Kateri .net uporabljaš?
Mogoče boš najenostavneje rešil s BackgroundWorker razredom.
Mogoče boš najenostavneje rešil s BackgroundWorker razredom.
http://blog.rthand.com/
SLODUG - uporabniška skupina
https://www.facebook.com/groups/slodug/
SLODUG - uporabniška skupina
https://www.facebook.com/groups/slodug/
Looooooka ::
1)Rajsi uporabljaj System.Threading.ThreadPool.QueueUserWorkItem ce res noces uporabljat backgroundworkerja
2) ne ne more biti bolj enostavno razen CE uporabis SynchronizationContext.Current in ga podas kot parameter queueuserworkitemu oz novemu threadu ce ze vztrajas.
potem lahko tam lepo klices .Post metodo in znotraj nje klices karkoli zelis na formi brez invokanja(lahko direkt funkcijo al pa znotraj System.Actiona(ce nisi na 2.0 frameworku), ker se bo vse klicalu v kontekstu GUI threada.
2) ne ne more biti bolj enostavno razen CE uporabis SynchronizationContext.Current in ga podas kot parameter queueuserworkitemu oz novemu threadu ce ze vztrajas.
potem lahko tam lepo klices .Post metodo in znotraj nje klices karkoli zelis na formi brez invokanja(lahko direkt funkcijo al pa znotraj System.Actiona(ce nisi na 2.0 frameworku), ker se bo vse klicalu v kontekstu GUI threada.
darkolord ::
Če uporabljaš 4.5, imaš v Async API rešitev za točno ta problem - IProgress<T>. Na koncu je zadeva precej bolj elegantna.
Glede primera na strani, lahko glavno metodo tudi pustiš blocking pa jo s Task.Run() poženeš asinhrono.
Glede primera na strani, lahko glavno metodo tudi pustiš blocking pa jo s Task.Run() poženeš asinhrono.
Zgodovina sprememb…
- spremenilo: darkolord ()
detroit ::
Hmm nazadnje in prvič ko sem uporabljal threade sem uporabil background worker in njegovo reportprogress()
Skero
darkkk ::
Najlepša hvala.
Ja, tudi background workerja sem gledal, ampak rabil sem neki "na hitro".
Vidim, da se bom moral precej bolj izobrazit na področju threadanja, predlogi za "dobro" literaturo na tem področju? (predvsem tako, ki ima "dober overview" zakaj se kaj rabi, detajli so itak na MSDN-ju).
Ja, tudi background workerja sem gledal, ampak rabil sem neki "na hitro".
Vidim, da se bom moral precej bolj izobrazit na področju threadanja, predlogi za "dobro" literaturo na tem področju? (predvsem tako, ki ima "dober overview" zakaj se kaj rabi, detajli so itak na MSDN-ju).
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | c# kam lambda delegat shrani spremenljivke? (in njegov scope)Oddelek: Programiranje | 3048 (2606) | Sportmania |
» | C# BackgroundWorker Class problemOddelek: Programiranje | 1259 (1215) | hendriks |
» | POMOČ: C# Spremenitev spremenljivke medtem ko teče ukaz whileOddelek: Programiranje | 1638 (1395) | Ericssony |
» | [C#] Dostop do objekta iz različnih formOddelek: Programiranje | 2163 (1876) | Kekec |
» | [c++] standardni c++ in dogodki(events)Oddelek: Programiranje | 1749 (1574) | yeti |