» »

C# threadanje in gui

C# threadanje in gui

darkkk ::

Ok, problem:
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
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

DuleKrtola ::

A ni dost enostavno?

mihies ::

Kateri .net uporabljaš?
Mogoče boš najenostavneje rešil s BackgroundWorker razredom.
http://blog.rthand.com/
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.

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.

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).

darkolord ::

En kratek pregled vgrajenih rešitev/implementacij za asinhrono izvajanje.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

c# kam lambda delegat shrani spremenljivke? (in njegov scope)

Oddelek: Programiranje
222901 (2459) Sportmania
»

C# BackgroundWorker Class problem

Oddelek: Programiranje
61182 (1138) hendriks
»

POMOČ: C# Spremenitev spremenljivke medtem ko teče ukaz while

Oddelek: Programiranje
91575 (1332) Ericssony
»

[C#] Dostop do objekta iz različnih form

Oddelek: Programiranje
182095 (1808) Kekec
»

[c++] standardni c++ in dogodki(events)

Oddelek: Programiranje
121668 (1493) yeti

Več podobnih tem