login  Naam:   Wachtwoord: 
Registreer je!
 Tutorials

Tutorials > VB.NET


Gegevens:
Geschreven door:
Mario
Moeilijkheidsgraad:
Normaal
Hits:
10601
Punten:
Aantal punten:
 
Aantal stemmen:
0
Stem:
Niet ingelogd
Nota's:
 Lees de nota's (3)
 


Tutorial:

Threading in vb.net

1. INLEIDING.
2. DEFINITIE VAN EEN THREAD.
3. TESTCASE.
4. HOE WERKT HET...
5. NADELEN.
6. SAMENVATTING.
7. SOURCECODE.
8. CONTACT.


1. INLEIDING

Threading of multithreading is niet meer dan vanuit je .net programma één of meerdere nieuwe instructies (programmacode) opstarten in een aparte proces.
Door bepaalde processen extern van je programma te laten lopen, ontlast je deze zodat deze beschikbaar blijft voor de gebruiker.
Een paar voorbeelden maken het voordeel duidelijk :

   -         Je wilt dat bepaalde code constant op de achtergrond blijft lopen (bv. een spellchecker)
   -         Bepaalde code belast je programma of duurt zodanig lang dat je eindgebruiker geen controle meer heeft over je GUI interface. Je programma “bevriest” of “hangt” als het ware totdat je code afgehandeld is.
   -         Je wilt meerdere kleine taken gelijktijdig uitvoeren .

Bovenstaande problemen kunnen we dus via (multi)threading omzeilen.
Hoe we dat juist kunnen doen lees je hieronder.

pijl top
2. DEFINITIE VAN EEN THREAD

“Thread” is de afkorting van “thread of execution” en wil eigenlijk niet meer zeggen als het achtereen uitvoeren van een reeks processor (CPU) instructies oftewel programmacode.
Een voorbeeld hiervan is je eigen .net programma.
Multithreading is dus meerdere threads of programmacode gelijktijdig laten lopen.

pijl top
3. TESTCASE

Tijd voor het echte werk nu ! Voor onze testcase gaan we :

01) Een array list vullen met een variabel aantal random gekozen integers.
02) Deze ascending sorteren.
03) Het sorteren visueel voorstellen.
04) De voortgang van het sorteren via een progressbar tonen.
05) Een 2de progressbar gelijktijdig laten lopen als toepassing op het multithread-principe.
06) Via “elapsed time” het tijdsverschil aantonen tussen threaded en non-threaded code.
07) Cancellen van een thread in uitvoering.

pijl top
4. HOE WERKT HET...

We gaan dus een aantal random getallen (integers) sorteren en deze visueel voorstellen. Dit geeft je niet alleen de kans om het sorteren zelf visueel te volgen, het maakt ook dat je programma zodanig zwaar wordt dat je duidelijk het verschil gaat kunnen zien tussen threaded en non-threaded code.

Het aantal getallen dat je gaat sorteren is via de slidebar aan de rechterkant in te stellen van 100 tot 800. Hoe meer getallen, te meer sorteeracties en des te zwaarder je programma de CPU zal belasten. Default staat hij op 400.

In het midden zie je de picturebox met rode lijnen. Één rode lijn vertegenwoordigd de waarde van één integer uit je array list.
Bij elke sorteerbeurt, doen we een refresh van de lijnen in onze picturebox. Op die manier krijg je een visuele voorstelling van het sorteren en kun je goed zien hoe de kleinere getallen naar links en de grotere getallen naar rechts opschuiven.

Links bovenaan kun je dan kiezen tussen de non-threaded en threaded verwerking van je code.
De code hiervoor (sorteren & visueel tonen van getallen) is identiek, enkel werk je dus met de threaded code via je backgroundworker en bij non-threaded code gewoon via je programma uit je main form. Met de Cancel-knop kun je de uitvoering van het sorteren onderbreken.
Onderaan zie je 2 progressbars waarvan de bovenste de voortgang van je sorteren voorstelt en onderaan een simpele counter om het multithread-principe aan te tonen.

Klik op de “nonthread” button en het sorteren begint. Wanneer je echter je window wilt verplaatsen/vergroten of op de cancel button drukt zul je zien dat je programma “hangt” totdat het sorteren voltooid is.
Dit komt omdat het sorteren zo CPU intensief is dat er geen tijd meer overblijft om je formulier te refreshen of zelfs maar te reageren op events van de gebruiker op het formulier.

Om dit te voorkomen kunnen we gebruik maken van de backgroundworker. Deze zal je sorteercode niet in je programma zelf afwerken, maar in een aparte thread zodoende je programma zelf alle tijd heeft om te reageren op events van je form.

Klik op Thread 1 en tijdens het sorteren kun je je programma alsnog verplaatsen, maximaliseren of eventueel cancellen zonder dat het invloed heeft op de performance van je hoofdprogramma.

Klik ook eens op Thread 2 tijdens het sorteren en de onderste progressbar zal onafhankelijk van Thread1 beginnen te lopen. Dit is dus het multithread principe oftewel meerdere threads gelijktijdig laten uitvoeren.

Achter “Elapsed Time” kun je de tijden vergelijken tussen threaded en non-threaded code. De ervaring leert dat threaded code sneller (+/- 10%) zal afgehandeld worden dan non threaded code al is dit natuurlijk sterk afhankelijk van je PC (CPU, geheugen,..).




4.1 DE BACKGROUNDWORKER CONTROL.

Om te beginnen slepen we de backgroundworker control van je toolbox naar je formulier. Deze vind je terug in de toolbox onder components en ziet er zo uit :


De BackgroundWorker control zal ons in staat stellen een thread te starten en eventueel ook te stoppen tijdens de uitvoering indien nodig.
De BackgroundWorker heeft ook een aantal properties waarvan WorkerReportsProgress en WorkerSupportsCancellation de belangrijkste zijn.


Met de WorkerReportsProgress propertie op True zal de Backgroundworker een event triggeren wat je in staat stelt om te zien hoever je thread gevorderd is in de uitwerking van zijn code. Handig als je bv. de voortgang via een progressbar wilt laten zien.

De WorkerSupportsCancellation propertie geeft je de mogelijkheid om je Thread te stoppen tijdens de uitvoering van je code. Dit kan van pas komen met langlopende threads. Hiervoor moet je waarde natuurlijk eerst op True zetten natuurlijk.



4.2 DE CODE.

Dowork - uitvoeren van je programmacode in een thread :
Om het simpel te houden, de programmacode die je wilt uitvoeren in je thread zet je gewoon in de dowork sub. In ons geval dus de code om onze array te sorteren en visueel voor te stellen. Het starten van de thread doe je via RunworkerAsync



ProgressChanged - voortgang laten zien aan de gebruiker :

Zoals in 4.1 aangehaald, als je de propertie WorkerReportsProgress van je backgroundworker op true zet, kun je met ReportProgress het ProgressChanged event aanroepen.
Als waarde kun je een integer meegeven waarbij je bv. het percentage meegeeft van het gedane werk.





RunworkerCompleted - thread is afgelopen :

Wanneer je thread is afgelopen, zal deze het RunWorkerCompleted event aanroepen. Hierin kun je eventueel de eindgebruiker bv verwittigen dat de taak erop zit of andere code plaatsen.


Cancel – Je thread afbreken :

Soms is het nodig om je thread te stoppen, de taak duurt bv. te lang of de gebruiker wilt je programma gewoon afsluiten. De propertie .IsBusygebruiken we hier om eerst te controleren of je thread wel in uitvoering is vooraleer je hem Cancelt. Zoniet zou dit een foutmelding geven.





pijl top
5. NADELEN.

Het gebruik van een thread via de Backgroundworker heeft ook zo zijn nadelen.
Zo kan je bv. via de code in je thread de controls van een andere thread niet bereiken.
Om het simpel te stellen, een listbox op je main form kun je niet opvullen met date uit je textfile die je via een thread inleest. Logisch aangezien het twee apart lopende processen zijn die niets met elkaar te maken hebben. Niet handig aangezien dit meestal de bedoeling is..

Maar ook hier zijn er natuurlijk oplossingen voor (invoke en delegating), deze zullen we in een volgende (advanced) tutorial over threads bespreken.

pijl top
6. SAMENVATTING.

Ondanks het feit dat (multi)threading niet altijd eenvoudig te implementeren is en veel meer omvat als deze korte tutorial, kun je toch met enkele simpele aanpassingen ervoor zorgen dat je applicatie zowel sneller als gebruiksvriendelijker wordt voor de eindgebruiker.

pijl top
7. SOURCECODE.

Zowel de documentatie, eventuele updates als sourcecode kun je downloaden op http://users.telenet.be/redthread/tutorials

pijl top
8. CONTACT.

Indien er opmerkingen of vragen zijn betreffende deze tutorial, kunt U mij altijd contacteren op onderstaande contactgegevens.

Email : RedThread@telenet.be
msn : Red_Thread@hotmail.com

pijl top



Volgende tutorial : Rekenmachine »

© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.013s