[C# Winforms] Serie operaties uitvoeren m.b.v. threading

Pagina: 1
Acties:
  • 416 views sinds 30-01-2008
  • Reageer

  • Tanuki
  • Registratie: Januari 2005
  • Niet online
Ik heb een programma dat CRC's uitrekent van bestanden.

Omdat de hele GUI van het programma hing tijdens het rekenen, wil ik gaan overstappen naar threads.

Ik heb allerlei artikels en guides gevonden op Google, dus ik weet inmiddels wel hoe het ongeveer werkt, maar ik kan alleen niet vinden hoe ik stukken code netjes achter elkaar kan laten uitvoeren?


Eigenlijk zoiets als dit:

C#:
1
2
3
4
5
while (itemExists(0))
{
    Console.WriteLine("Calculated CRC of " + items[0].File + ": " + CalculateCRC(items[0].File));
    items.Remove(0);
}

Let op dat dit slechts pseudocode is, maar ik wil dus gewoon door items heenlopen, van de eerste de CRC uitrekenen en deze dan verwijderen. Dit wil ik doen zolang er items zijn (zolang er een item 0 is). (Natuurlijk komen hier nog fancy dingen omheen zoals progress bars enzo, vandaar de winforms, maar dat is voor het probleem (denk ik) niet van belang.)


Nu heb ik de "background worker" gevonden en ook enkele artikels hierover gevonden, maar als ik deze in een while gebruik krijg ik de melding dat ik pas weer iets met het background worker-object kan doen als deze klaar is (hij wacht dus helemaal niet tot 'ie klaar is...).

Nu heb ik de ThreadPool gevonden, hiermee kan je dus een queue maken van opdrachten die uitgevoerd moeten worden, dus ik netjes in die while dingen toevoegen aan de queue, maar nou zijn de opdrachten door elkaar klaar.
Ik doe bijv. opdracht 1, 2, 3, 4, 5, 6, 7 en 8 toevoegen en de volgorde waarin ze klaar zijn is bijv. 1, 2, 4, 5, 6, 3, 8, 7 (ofzo).

Ik zit dus eigenlijk een beetje vast, ik kan niks meer bedenken wat een beetje structuur brengt in het threaden enzo... Ik zou graag een schopje in de goede richting krijgen van iemand, bijv. een helder artikel waarin *meerdere* threads achter elkaar worden uitgevoerd (en waarbij ook wordt gewacht tot de vorige thread klaar is) (wat ik vind op Google is 1 enkele opdracht die veel tijd inneemt op de achtergrond draaien).

Alvast bedankt voor de replies. :P

PV: Growatt MOD5000TL3-XH + 5720wp, WPB: Atlantic Explorer v4 270LC, L/L: MHI SCM 125ZM-S + SRK 50ZS-W + 2x SRK 25ZS-W + SRK 20ZS-W Modbus kWh meter nodig?


  • remco_k
  • Registratie: April 2002
  • Laatst online: 21:24

remco_k

een cassettebandje was genoeg

1 thread maken en daarin je while lus maken die de items afhandeld?

Edit:

Dus vanuit je mainthread een extra thread maken en starten.
De mainthread komt weer 'vrij', direct na het starten van de extra thread.
En de extra thread gaat nu item voor item behandelen en stuurt desnoods updates naar het form om de progress te laten zien.

[ Voor 67% gewijzigd door remco_k op 01-06-2007 21:22 ]

Alles kan stuk.


  • Tanuki
  • Registratie: Januari 2005
  • Niet online
remco_k schreef op vrijdag 01 juni 2007 @ 21:20:
1 thread maken en daarin je while lus maken die de items afhandeld?

Edit:

Dus vanuit je mainthread een extra thread maken en starten.
De mainthread komt weer 'vrij', direct na het starten van de extra thread.
En de extra thread gaat nu item voor item behandelen en stuurt desnoods updates naar het form om de progress te laten zien.
Oh en dan zou ik daar die while loop kunnen doen?

Ik wou in die thread die werd gemaakt vanuit het hoofdprogramma een while loop maken en in die while loop dus weer threads gaan gebruiken (om elke keer dat 'ie in de loop komt weer te threaden). Maar eigenlijk is dat wat jij zegt volkomen logisch. 8)7

:X Bedankt, ik ben er misschien even niet helemaal bij geweest of ik heb gewoon teveel verschillende manieren gezien...

PV: Growatt MOD5000TL3-XH + 5720wp, WPB: Atlantic Explorer v4 270LC, L/L: MHI SCM 125ZM-S + SRK 50ZS-W + 2x SRK 25ZS-W + SRK 20ZS-W Modbus kWh meter nodig?


  • remco_k
  • Registratie: April 2002
  • Laatst online: 21:24

remco_k

een cassettebandje was genoeg

l0c4lh0st schreef op vrijdag 01 juni 2007 @ 21:47:
[...]

Oh en dan zou ik daar die while loop kunnen doen?
Yep
Ik wou in die thread die werd gemaakt vanuit het hoofdprogramma een while loop maken en in die while loop dus weer threads gaan gebruiken (om elke keer dat 'ie in de loop komt weer te threaden). Maar eigenlijk is dat wat jij zegt volkomen logisch. 8)7
Dat kan wel, maar dan heb je geen controle over de volgorde waarin de verschillende threads ... ehm... klaarkomen.
Verder heeft die techniek geen enkel voordeel voor het doel wat jij hebt. Behalve dan als door een bug de boel vast zou lopen (deadlock). In het geval van meerdere threads zou er dan 1 blijven hangen terwijl de rest gewoon z'n werk afmaakt. Maar then again: bugs moeten worden opgelost ipv omzeilt. Daarbij is het meestal best complex om een applicatie met meer dan 2 verschillende threads goed te debuggen.
:X Bedankt, ik ben er misschien even niet helemaal bij geweest of ik heb gewoon teveel verschillende manieren gezien...
Dat is bij mij ook vaak het geval... Iets te complex denken, inzicht van een buitenstaander die even vanaf scratch het idee bekijkt komt vaak met de oplossing. :+

Is het inmiddels gelukt?

Alles kan stuk.


  • ? ?
  • Registratie: Mei 2007
  • Niet online

? ?

..

[ Voor 131% gewijzigd door ? ? op 25-01-2013 09:53 ]