Threading in.net (C#)
|
|
- Victor Goossens
- 8 jaren geleden
- Aantal bezoeken:
Transcriptie
1 Threading in.net (C#) 1. Inleiding Iedereen hoorde wel al eens van de obscure programmeer-/os-/cpu-techniek threading of multithreading. Velen hebben er waarschijnlijk nog niet mee gewerkt, of worden afgeschrikt door de mogelijke moeilijkheidsgraad van het programmeren met threads. In feite heeft iedereen die al eens een programma schreef (bvb. Een Windows Forms Applicatie) al onbewust met minstens één thread gewerkt. En wat nog mooier is, het.net Framework zorgt ervoor dat het werken met threads eenvoudiger is dan ooit. Nu, wat is een thread in feite? Een applicatie die opgestart wordt krijgt een proces toegewezen door het besturingssysteem. Een proces is een hoeveelheid computergeheugen, toegewezen aan een applicatie door het besturingssysteem, waarin de applicatie dan kan actief zijn. Een thread is een eenheid van uitvoering binnen een proces, waarvoor het besturingssysteem verwerkingstijd door de processor reserveert. Een proces heeft altijd minstens 1 actieve thread. Start bijvoorbeeld eens een nieuw C# Windows Application project, en ga kijken naar de code. De start van ons programma ligt binnen de Main-methode: Application.Run ( new Form1() ) zal je Windows Form Applicatie opstarten in de huidige thread (zie Application.Run in de MSDN documentatie). Omdat hier in feite ons programma gestart wordt, zal ons programma dus uitgevoerd worden in de hoofdthread van het door het besturingssysteem toegewezen proces. Noot: In tegenstelling tot wat je zou denken, heeft het statement [STAThread] weinig te maken met deze hoofdthread binnen het applicatieproces. Deze statement is bedoeld voor COM interop. Als er geen COM componenten gebruikt worden, heeft deze geen effect. Meer info:
2 Oké, dus een programma loopt dus via een thread binnen een proces!? Waarom dan nog extra threads aanmaken? Neem bijvoorbeeld dat je een download manager programma wil schrijven. Het programma moet bestanden van Internet downloaden naar je lokale pc. Neem daarbij als voorbeeld dat het over een bestand van 200 megabytes gaat. Je programma maakt de nodige objecten en verbindingen aan om het bestand te downloaden, en je komt nu dus in een loop terecht waarbij je de data binnenhaalt. Ow wat nu mijn programma lijkt vast te hangen!? In feite hangt je programma niet, maar zit je vast in een loop die de data binnenhaalt naar je lokale pc. Doordat je in die loop blijft steken binnen de hoofdthread, kan je tijdelijk niks anders doen tot het volledige bestand binnengehaald is. Dit kan echter simpel opgelost worden door het binnenhalen van de data door een nieuwe thread te laten gebeuren. Het binnenhalen van de gegevens gebeurt dan via de nieuwe thread, en de hoofdthread blijft komt niet vast te zitten in de loop. Dat klinkt interessant, dan gebruiken we toch hier, daar en overal threads om allerlei acties uit te voeren? Het gebruik van threads heeft zowel voor- als nadelen. Een groot voordeel is dat je verschillende taken tegelijk kan laten uitvoeren, meerdere threads kunnen tegelijk door de processor worden uitgevoerd. Daar tegenover staan echter enkele nadelen. Iedere nieuwe thread zal geheugen en tijd vragen van het besturingssysteem. Het is belangrijk goed na te denken vooraleer hier, daar en overal threads te gebruiken. Een algemeen aanvaarde regel zegt zo weinig mogelijk threads te gebruiken. Bij netwerkapplicaties, ons voorbeeld van een download manager, een eigen webserver, etc. kan je bijna onmogelijk zonder threads werken, omdat er meerdere connecties gemaakt en tegelijk verwerkt moeten worden. Zo zal een webserver of netwerkapplicatie misschien meerdere clients moeten kunnen behandelen, en zal onze download manager meerdere bestanden tegelijk moeten kunnen downloaden.
3 Threads gebruiken brengt een verhoogde complexiteit met zich mee. Zo zal je er bijvoorbeeld voor moeten zorgen dat 2 threads niet gelijktijdig dezelfde data aanspreken, want dan kom je terecht in een zogenaamde deadlock. Hierbij wensen beide threads data aan te spreken die in gebruik is door de andere thread, waardoor de data niet vrijgegeven wordt aan de andere thread. Via thread synchronisatie (waarop we straks terug komen) is dit echter mooi op te lossen.
4 2. De Threading namespace Om met threads te kunnen werken in een.net applicatie dien je een reference toe te voegen naar de System.Threading namespace. using System.Threading; Om een thread te definiëren maken we gebruik van de klasse Thread uit deze namespace. Naast de klasse Thread bevat de Threading namespace ook nog enkele belangrijke klassen zoals Monitor en Mutex, die we later gaan nodig hebben om onze threads goed te beheren en te synchroniseren. Een thread definiëren gaat als volgt: Thread mythread = new Thread( new ThreadStart( [object].method ) ); Je merkt onmiddellijk iets vreemds, namelijk ThreadStart. Kijk eens naar de parameter die meegegeven wordt met de constructor van ThreadStart. Je geeft een methode mee als parameter. ThreadStart is een delegate (dus een reference naar een methode). Via ThreadStart specifieer je dus welke methode door de thread moet uitgevoerd worden. (vervolgt)
5 We maken een klein voorbeeldprogramma. Start een nieuw C# Windows Application project en dubbelklik op de Form. Visual Studio brengt je nu automatisch naar de methode Form_Load in het codevenster. Voeg bovenaan je code de reference toe naar de Threading namespace (zie hoger), en voeg een private field private Thread t; toe. Voeg volgende methode toe aan je klasse Form1: private void TestPrint() while( true ) Console.WriteLine("Hello world"); Thread.Sleep(1000); (Ik kom meteen terug op het blijkbaar ongeinstancieerd gebruik van Thread.Sleep) Aan je Form_Load methode voeg je volgende code toe: t = new Thread( new ThreadStart( TestPrint ) ); t.start(); Als je nu de applicatie start, zal er telkens met een interval van 1 seconde de tekst Hello world verschijnen in de Console van Visual Studio. Proficiat je allereerste simpele multithreading applicatie is een feit. Nu, omtrent het gebruik van Thread.Sleep in de methode TestPrint: We hebben geen object Thread aangemaakt, dus moet dit wel een statische methode zijn van de klasse Thread. Wanneer we Thread.Sleep aanroepen, dan hebben we het automatisch over de thread die op dit moment wordt uitgevoerd. We hebben onze thread gestart met de methode TestPrint als gedelegeerde methode, waardoor het gebruik van de statische methoden van de klasse Thread binnen deze methode enkel kan duiden op de thread die deze methode uitvoert. (Een soort van this voor threads als het ware) De statische methode Sleep( int millisecondstimeout ) zegt de thread om een aantal milliseconden te wachten vooraleer verder te gaan met zijn uitvoering. Wat we nu doen is simpel, en werkt, maar is niet meteen good coding practice. We hebben niet gekeken of dit een background of foreground thread is, en we hebben de thread niet afgesloten bij het beëindigen van ons programma. Daarover meer in het volgende onderdeel
6 3. Stoppen, Uitstellen en Hervatten van threads We wensen wat meer controle over onze threads. Zoals kort en onnauwkeurig uitgelegd op het einde van vorig onderdeel weten we bij onze vorige applicatie niet wat er gebeurde met onze thread na het sluiten van de applicatie. Foreground en background threads Een thread kan een foreground of een background thread zijn. Deze verschillen in feite weinig van elkaar, maar een foreground thread kan ervoor zorgen dat een proces niet afgesloten kan worden vooraleer de foreground thread afgelopen is. Een background thread worden afgesloten wanneer het proces wordt beëindigd. Standaard staat een nieuwe thread ingesteld op foreground. Als je in de voorbeeldapplicatie van deel 2 (zie hoger) de property IsBackground opvraagt van onze Thread t, dan staat die op false, wat betekent dat het een foreground thread is. Dit kan ervoor zorgen dat het door het besturingssysteem toegewezen proces niet afgesloten kan worden (zeker in ons geval, omdat we een while(true) loop gebruiken, die nergens wordt beëindigd). De systeembronnen die nodig waren voor het proces en de thread blijven in dit geval in gebruik, wat vertragingen of zelfs crashes van je besturingssysteem kan veroorzaken (onze Thread t zou niet zo enorm veel bronnen innemen en zou niet zoveel CPU-tijd eisen omdat die telkens een second slaapt, maar in ingewikkelder programma s zou dit wel desastreuze gevolgen kunnen hebben). (Nu niet meteen panikeren, we werkten in debug mode met Visual Studio, die er bij het debuggen voor zorgt dat alles mooi geregeld wordt) Dit even tussendoor om het belang van het beheren van je threads aan te stippen. (vervolgt)
7 Een thread stoppen Het manueel stoppen van een thread gebeurt via de methode Abort van de thread. Wat deze methode doet is een ThreadAbortException gooien (throw). Er wordt dus een Exception gegenereerd in ons voordeel teneinde de thread te beëindigen. Deze ThreadAbortException moet opgevangen worden, anders wordt die door ons programma als fout aanzien en vliegen we uit het programma. Je dient de code van onze methode TestPrint als volgt aan te passen: private void TestPrint() try while( true ) Console.WriteLine("Hello world"); Thread.Sleep(1000); catch( ThreadAbortException tae ) Console.WriteLine("Thread aborted"); finally Console.WriteLine("Thread cleanup" ); Nu wordt de ThreadAbortException opgevangen, en wordt er een boodschap in de Visual Studio Console weergegeven. Om de thread te stoppen, plaats een button op je Form, en voeg volgende code toe bij het Click event ervan : private void button1_click(object sender, System.EventArgs e) t.abort(); t.join(); Wanneer je nu de applicatie start wordt de thread gestart via de Form_Load methode, en als je dan klikt op de knop, dan zal de thread beëindigd worden.
8 Wanneer we de methode Abort van onze thread uitvoeren, wordt dus een ThreadAbortException gegenereerd, die opgevangen wordt door ons catch-block. Voordat de thread eindigt zal ook nog de code in het finally-block uitgevoerd worden, hier kun je bijvoorbeeld cleanup -code plaatsen die bronnen vrijmaakt die niet meer nodig zijn wegens het beëindigen van de thread. Je ziet ook dat we de Join methode van de te beëindigen thread aanroepen. Join zorgt er in ons voorbeeld voor dat de thread die het beëindigen van onze thread aanroept geblokkeerd wordt tot onze thread klaar is. Bij ons voorbeeld zal de hoofdthread van ons programma dus moeten wachten tot de code in het finally-block afgewerkt is. Uitstellen (Suspend) en Hervatten (Resume) van een thread De benaming van deze methoden spreekt zowat voor zichzelf. De methode Suspend() pauzeert als het ware de thread. De uitvoering gaat pas verder als de methode Resume() aangeroepen wordt. Blangrijke noot: Als je een suspended thread wil afsluiten (Abort), dan moet je eerst de thread hervatten (Resume) vooraleer je de methode Abort aanroept. De MSDN documentatie zegt dat dit automatisch gebeurt bij het aanroepen van de methode Abort, maar artikels op Internet van verschillende programmeurs spreken dit tegen. Blijkbaar gebeurt het niet altijd automatisch, en maak je er best een gewoonte van om de thread eerst te hervatten vooraleer je deze sluit. (vervolgt)
9 De thread status We kunnen nu al een thread starten, pauzeren en hervatten, maar hoe weten we nu in welke status de thread op een gegeven moment verkeert? Een instantie van de klasse Thread heeft een enumeration property ThreadState. Je kan te allen tijde de status van de thread via deze property evalueren. Mogelijke ThreadStates voor de Thread.ThreadState property: Aborted AbortRequested Background Running Stopped StopRequested Suspended SuspendRequested Unstarted WaitSleepJoin Thread is gestopt De Abort methode werd uitgevoerd op deze thread, maar de ThreadAbortException is nog niet thrown. Wordt uitgevoerd als background thread. Thread wordt momenteel uitgevoerd. De thread is gestopt. Het stoppen van de thread werd aangevraagd. De thread is uigesteld. Er werd de thread gevraagd Suspended te worden. De thread is nog niet gestart. De thread is geblokkeerd door aanroep van Wait, Sleep of Join. Daar dit ThreadState property een enumeration is kan je bijvoorbeeld op volgende manier een code-block uitvoeren wanneer de thread actief is: if (mythread1.threadstate!= (ThreadState.Stopped ThreadState.Unstarted)) //thread is niet gestopt en is wel gestart //uit te voeren code (vervolgt)
10 De prioriteit van een thread Een thread heeft altijd een specifieke prioriteit. Standaard (als je zelf geen andere prioriteit opgeeft) staat de prioriteit van een thread ingesteld op Normal. Het instellen van de prioriteit van een thread gebeurt via de enumeration property Priority van een thread. Zoals eerder reeds aangehaald krijgt iedere thread een zekere CPU-verwerkingstijd toegewezen door het besturingssysteem. Wat ik nog niet vermeldde, is dat het besturingssysteem ook rekening houdt met de prioriteit van een thread om deze verwerkingstijd toe te wijzen. Zo gaan de threads met een hogere prioriteit vlugger en meer verwerkingstijd toegewezen krijgen. In.Net kan je 5 verschillende prioriteitsniveaus toewijzen aan een thread, namelijk Highest, AboveNormal, Normal, BelowNormal en Lowest. Een thread met als prioriteit Highest zal eerst en meest verwerkingstijd toegewezen krijgen van het besturingssysteem. AboveNormal zal gepland worden voor de threads met lagere prioriteit, maar na threads met Highest prioriteit, enzovoort. Een thread met als prioriteit Lowest zal pas na alle andere threads met hogere prioriteit gepland worden door het besturingssysteem. Mocht je nu een voorbeeldapplicatie maken, met laat ons zeggen 5 threads, waarvan iedere thread één van de verschillende prioriteiten heeft. Zorg ervoor dat de thread met laagste prioriteit eerst gestart wordt, daarna telkens de thread met hogere prioriteit startend. Je zal merken dat de thread met prioriteit Highest eerst zal uitgevoerd worden en als eerste de status Stopped zal bereiken, daarna de thread met prioriteit AboveNormal, enzovoort. (vervolgt)
11 Pas uit het vorige voorbeeld de methode TestPrint aan, zodanig dat de methode geen oneindige loop verwerkt (zet while (true) bijvoorbeeld in commentaar) en verwijder ook Thread.Sleep(1000). Een thread object heeft een string-property Name. Deze gaan we gebruiken om onze threads te identificeren. Gebruik volgende code om de threads uit te voeren: x = new Thread( new ThreadStart( TestPrint ) ); x.priority = ThreadPriority.Lowest; x.name = "lowest_priority_thread"; w = new Thread( new ThreadStart( TestPrint ) ); w.priority = ThreadPriority.BelowNormal; w.name = "belownormal_priority_thread"; v = new Thread( new ThreadStart( TestPrint ) ); v.priority = ThreadPriority.Normal; v.name = "normal_priority_thread"; u = new Thread( new ThreadStart( TestPrint ) ); u.priority = ThreadPriority.AboveNormal; u.name = "abovenormal_priority_thread"; t = new Thread( new ThreadStart( TestPrint ) ); t.priority = ThreadPriority.Highest; t.name = "high_priority_thread"; x.start(); w.start(); v.start(); u.start(); t.start(); Resultaat in de Visual Studio console (in chronologische volgorde): The thread 'high_priority_thread'(0xef4) has exited with code 0 (0x0). The thread 'abovenormal_priority_thread'(0xec8) has exited with code 0 (0x0). The thread 'normal_priority_thread'(0x8ec) has exited with code 0 (0x0). The thread 'belownormal_priority_thread'(0x968) has exited with code 0 (0x0). The thread 'lowest_priority_thread'(0xde4) has exited with code 0 (0x0). Niettegenstaande deze threads alle tegelijk werden gestart in stijgende volgorde van prioriteit, zien we dat de de threads met de hogere prioriteit toch eerst uitgevoerd worden.
12 Plaats nu eens de regel code Thread.Sleep (1000) terug in de methode TestPrint. De output naar de console wijzigt als volgt: The thread lowest_priority_thread (0x70) has exited with code 0 (0x0). The thread high_priority_thread (0x630) has exited with code 0 (0x0). The thread abovenormal_priority_thread (0xed4) has exited with code 0 (0x0). The thread belownormal_priority_thread (0xf48) has exited with code 0 (0x0). The thread normal_priority_thread (0xf18) has exited with code 0 (0x0). Omdat iedere thread gevraagd wordt om te slapen (Sleep), wordt de uitvoering doorgegeven aan de volgende thread met hoogste prioriteit vooraleer de huidige thread weer uitvoeringstijd krijgt. Zo kan je de uitvoering van threads met lagere prioriteit forceren. Natuurlijk is dit geen goede manier van werken. In het volgende onderdeel gaan we het hebben over synchronisatie van threads.
13 4. Threads synchroniseren Wanneer je een applicatie maakt die gebruik maakt van threads kan het makkelijk gebeuren dat 2 threads hetzelfde object of dezelfde methode van een object moeten aanspreken, wat desastreuze gevolgen kan hebben. Neem als voorbeeld een applicatie die werkt met een achterliggende database. We hebben een methode Update, die gegevens aanpast in de database. Er wordt een thread gestart die onze methode Update gebruikt. Kort daarna wordt een tweede thread gestart, die ook deze methode moet aanroepen, de eerste thread is echter nog niet klaar met de uitvoering van de Update. Het besturingssysteem zet de uitvoering van de eerste thread op uigesteld (Suspended), en start de tweede thread. De eerste thread was echter nog niet klaar, en het aangeroepen object verkeert in een ongeldige staat. Wanneer de tweede thread nu het object aanspreekt zal de applicatie natuurlijk crashen, of soms zelfs erger (verloren gegevens, data corruptie, etc). Je moet er rekening mee houden dat een thread uitgevoerd zal worden wanneer het besturingssysteem dit beslist, niet wanneer jij wil dat dit zal gebeuren. Het is dus noodzakelijk threads te synchroniseren, zeker als we met meerdere threads dezelfde data of objecten moeten aanspreken. Wanneer we het hebben over thread synchronisatie hebben we het ook over Thread Safety (Bij de documentatie van vele objecten in de MSDN staat dan ook vermeld als ze al dan niet thread safe zijn). Thread Safe betekent dat op elk moment dat een object dat aangeroepen of gebruikt wordt door een thread, dit object zich in een geldige staat bevindt. Ik haal een codevoorbeeld aan dat ik vond op internet van een zeker meneer Ben Hinton. Maak zoals bij de vorige voorbeelden een applicatie, die 2 threads start. Gebruik als gedelegeerde methode de methode WriteToFile van een object FileIO (onderstaande code). Geef beide threads een naam (Name property), bijvoorbeeld thread 1 en thread 2. De methode WriteToFile zal de threadnaam en enkele getallen naar het bestand SyncTest.txt proberen te schrijven.
14 using System; using System.Threading; using System.IO; using System.Text; class SyncTest static void Main(String[] args) // Create the object we want to use on the threads FileIO obj = new FileIO(); // Define and start the threads Thread t1 = new Thread(new ThreadStart(obj.worker1)); t1.name = "Thread 1"; Thread t2 = new Thread(new ThreadStart(obj.worker2)); t2.name = "Thread 2"; t1.start(); t2.start(); class FileIO public void worker1() WriteToFile(); public void worker2() WriteToFile(); private void WriteToFile() // Open a file FileStream fs = new FileStream("C:\\Temp\\SyncTest.txt", FileMode.Append); // Get the current thread Thread t = Thread.CurrentThread; // Write some data to the file fs.write(encoding.ascii.getbytes(t.name + "\r\n"), 0, t.name.length+2); for (int i=0; i<100000; i++) fs.write(encoding.ascii.getbytes(i + ","), 0, i.tostring().length+1); // Close the file fs.close();
15 Wanneer je de applicatie start, dan zal deze crashen. Beide threads spreken hetzelfde object aan, en wanneer de 2 e thread het object aanspreekt zal het FileIO object zich in een ongeldige staat bevinden (Terwijl de eerste thread nog naar het bestand aan het schrijven is, wordt de thread uitgesteld (Suspended) door het besturingssysteem). Wat we moeten doen is het object vergrendelen (locking). We kunnen dit doen aan de hand van de klasse Monitor. We starten het monitoren van een object via de statische methode Enter van klasse Monitor en stoppen de lock via de statische methode Exit ervan. Beide methoden nemen een object als parameter. We gebruiken this als parameter om op het object zelf te duiden. Hercompileer je applicatie met volgende aangepaste methode WriteToFile: private void WriteToFile() // Obtain an exclusive lock on this object Monitor.Enter(this); // Open a file FileStream fs = new FileStream("C:\\Temp\\SyncTest.txt", FileMode.Append); // Get the current thread Thread t = Thread.CurrentThread; // Write some data to the file fs.write(encoding.ascii.getbytes(t.name + "\r\n"), 0, t.name.length+2); for (int i=0; i<100000; i++) fs.write(encoding.ascii.getbytes(i + ","), 0, i.tostring().length+1); // Close the file fs.close(); // Release the lock on this object Monitor.Exit(this); Je zal merken dat de applicatie niet meer crasht, en wat meer is, de applicatie zal nu zelfs perfect werken. De tweede thread zal nu moeten wachten tot wanneer de uitvoering van de aanroep van WriteToFile door de eerste thread afgelopen is. De Monitor klasse is een kleine klasse met slechts 6 methoden, die alle static methoden zijn. Straks kom ik terug op enkele andere methoden van deze klasse.
16 We hebben nu gezien hoe we een object kunnen vergrendelen opdat we geen deadlocks of crashes krijgen via het werken met threads. Maar wat nu als bepaalde code binnen een vergrendeld object een Exception zou genereren? We zouden dus uit de methode vliegen, maar het object zou wel vergrendeld blijven, zodat geen enkele andere thread er nog toegang toe zal krijgen. Dit lossen we op door een try-catch-finally codeblock, we plaatsen Monitor.Exit(this); in het finally block, zodat het object niettegenstaande wat er ook mag gebeuren toch weer vrijgegeven wordt. private void WriteToFile() try // Object vergrendelen Monitor.Enter(this); // Doe iets DoSomething(); catch (System.Exception e) // Exception handling Console.WriteLine(e.Message); finally // Object vrijgeven Monitor.Exit(this); Noot: Zijn C# en.net niet fantastisch!?
17 5. De Monitor klasse We zagen in hoofdstuk 4 reeds het gebruik van de statische methoden Enter en Exit om threads te synchroniseren. De klasse Monitor heeft echter nog 4 andere methoden. De methode TryEnter Gelijkaardig aan de methode enter. Deze methode probeert een object te vergrendelen, maar in tegenstelling tot de methode Enter geeft deze methode een boolean waarde terug (true voor geslaagd, false voor mislukt). Deze methode heeft 3 overloads: Overload List (uit MSDN documentatie) Attempts to acquire an exclusive lock on the specified object. public static bool TryEnter(object); Attempts, for the specified number of milliseconds, to acquire an exclusive lock on the specified object. public static bool TryEnter(object, int); Attempts, for the specified amount of time, to acquire an exclusive lock on the specified object. public static bool TryEnter(object, TimeSpan); Net als bij de Enter methode moet je een object reference meegeven voor het object dat moet vergrendeld worden, maar via een overload kun je ook opgeven voor hoelang er moet geprobeerd worden om het object te vergrendelen. De methode Wait Als je een object vergrendelde met Monitor.Enter, maar je wenst er nu toch een andere thread toegang tot geven, dan kan je de methode Wait oproepen. Deze zal de huidige thread uitstellen tot de nieuwe thread (die nu toegang zal krijgen tot het object) het object terug vrijgeeft. (vervolgt)
18 De methode Wait heeft ook een reeks overloads: Overload List (uit de MSDN documentatie) Releases the lock on an object and blocks the current thread until it reacquires the lock. public static bool Wait(object); Releases the lock on an object and blocks the current thread until it reacquires the lock or a specified amount of time elapses. public static bool Wait(object, int); Releases the lock on an object and blocks the current thread until it reacquires the lock or a specified amount of time elapses. public static bool Wait(object, TimeSpan); Waits for notification from an object that called the Pulse or PulseAll method or for a specified timer to elapse. This method also specifies whether the synchronization domain for the context (if in a synchronized context) is exited before the wait and reacquired. public static bool Wait(object, int, bool); Releases the lock on an object and blocks the current thread until it reacquires the lock, or until a specified amount of time elapses, optionally exiting the synchronization domain for the synchronized context before the wait and reacquiring the domain. public static bool Wait(object, TimeSpan, bool); De methode Pulse Deze methode kan enkel door de thread die de rechten op het object beheerst uitgevoerd worden. Deze methode zal aan de thread die wacht (bijvoorbeeld een thread die Wait aanriep, en zo het object tijdelijk vrijgaf) op het vrijkomen van het object te kennen geven dat het object nu vrij is om te gebruiken. Deze methode heeft geen overloads en neemt slechts de reference naar het object als parameter. De methode PulseAll Deze methode verschilt van de methode Pulse in die mate dat deze methode aan ALLE actieve threads te kennen zal geven dat het object ontgrendeld is, en dus niet enkel aan de thread die via een aanroep van Wait wacht op het vrijkomen van het object. Ook deze methode heeft geen overloads, en neemt een reference naar een object als parameter.
19 Ik neem terug voorbeeldcode van de vriendelijke meneer Hinton om dit te demonstreren: using System; using System.Threading; public class RWSync public static void Main(string[] args) // Create a SyncTest object SyncTest st = new SyncTest(); // Define two threads Thread t1 = new Thread(new ThreadStart(st.ThreadWrite)); Thread t2 = new Thread(new ThreadStart(st.ThreadRead)); // Start the threads t1.start(); t2.start(); // Call Join() to make sure they have terminated t1.join(); t2.join(); public class SyncTest // Private boolean flag to determine if we should read or write private bool isread = false; // Private variable to hold the ingeger being written to/read from int data = 0; // Public method to run on worker thread public void ThreadRead() for (int i=0; i<20; i++) ReadLoop(); // Public method to run on worker thread public void ThreadWrite() for (int i=0; i<20; i++) WriteLoop(i);
20 // Read the current number then use Pulse to release the lock public int ReadLoop() try // Obtain an exclusive lock Monitor.Enter(this); // If we are not meant to be on a read - then Wait! if (!isread) Monitor.Wait(this); // Read the contents of the data variable to the console Console.WriteLine("Read : 0", data); // Set isread to false, to prepare for performing a Write // and alert the other thread so it can continue isread = false; Monitor.Pulse(this); catch (SystemException e) // Catch exceptions here... Console.WriteLine("Exception caught: " + e.message); finally // Release the exclusive lock on the object Monitor.Exit(this); return data; public void WriteLoop(int i) try // Obtain an exclusive lock Monitor.Enter(this); // If the flag is set to true (ie Read) then Wait if (isread) Monitor.Wait(this); // Set the data variable and write to the console data = i; Console.WriteLine("Write : 0", data);
21 // Set the isread flag to true and alert the other thread isread = true; Monitor.Pulse(this); catch (SystemException e) // Catch exceptions here... Console.WriteLine("Exception caught: " + e.message); finally // Release the excluseive lock on the object Monitor.Exit(this); Deze code lijkt meteen heel wat ingewikkelder. Neem uw tijd en bestudeer de code aandachtig, want deze code is van hetzelfde niveau als waarop we tot nochtoe werkten. Er is een klasse SyncTest gedefinieerd, die 4 methodes heeft. 2 ervan (ThreadRead en ThreadWrite) gaan de gedelegeerde methoden zijn voor de 2 threads die we in dit voorbeeld gaan gebruiken. Deze 2 methoden roepen respectievelijk de 2 andere methoden (ReadLoop en WriteLoop) aan. Zoals je meteen ziet, gaan de 2 threads gesynchroniseerd zijn door het gebruik van Monitor.Enter en Monitor.Exit in deze 2 loop-methoden. Als je kijkt naar de fields van de klasse SyncTest zie je een boolean variabele isread. Deze zal als flag gebruikt worden door de threads om te zien of er moet gelezen of geschreven worden naar de variabele data. Aan de hand van de boolean variabele isread weten de threads dat er eerst moet geschreven worden, de Thread t1 zal dus eerst rechten op het SyncTest object krijgen. Via de methode WriteLoop zal t1 een integer waarde in de variabele data plaatsen. Meteen daarna wordt de isread flag op true gezet en wordt Monitor.Pulse aangeroepen voor deze thread. Zo weet de tweede thread (t2) dat het object vrijkwam. Nu krijgt Thread t2 de mogelijkheid (het object is ontgrendeld) via de methode ReadLoop de waarde die t1 in de variabele data schreef af te drukken naar de console. Thread t2 zet daarna terug isready op false enzovoort. Als output krijg je afwisselend Write n en Read n (met n de integer variabele die op dat moment in variabel data stak.
22 6. Het lock statement Het vergrendelen van objecten (Monitor klasse) voor gebruik met threads is heel belangrijk, er is zelfs een lock statement gedefinieerd in.net, waarmee je op kortere schrijfwijze hetzelfde kan doen als met het in hoofdstuk 4 beschreven try-catchfinally codeblock in samenwerking met Monitor.Enter en Monitor.Exit. Zo kan je de voorbeeldcode in hoofdstukje 4 ook korter als volgt schrijven (het trycatch-finally codeblock met Monitor.Enter en Monitor.Exit wordt dan op de achtergrond door de compiler gegenereerd): private void WriteToFile() lock (this) // Doe iets DoSomething(); (Uit de MSDN documentatie) The lock statement obtains the mutual-exclusion lock for a given object, executes a statement, and then releases the lock. lock-statement: lock ( expression ) embedded-statement The expression of a lock statement must denote a value of a reference-type. No implicit boxing conversion is ever performed for the expression of a lock statement, and thus it is a compile-time error for the expression to denote a value of a value-type. A lock statement of the form lock (x)... where x is an expression of a reference-type, is precisely equivalent to System.Threading.Monitor.Enter(x); try... finally System.Threading.Monitor.Exit(x);
23 Mogelijke uitbreiding: het Mutex object. Veel plezier. Kris.
Programmeren in Java 3
7 maart 2010 Deze les Zelf componenten maken Concurrency (multithreading): werken met threads levenscyclus van een thread starten tijdelijk onderbreken wachten stoppen Zelf componenten maken Je eigen component:
Nadere informatieOndanks het feit dat we ons specifiek richten op het.net
Maarten Struys is.net Compact Framework MVP bij PTS Software bv.net Compact Framework D E E L 2 : M U LT I T H R E A D E D A P P L I C AT I E S VO O R W I N D OW S C E In nummer 8 van het.net Magazine
Nadere informatieEen gelinkte lijst in C#
Een gelinkte lijst in C# In deze tutorial ga demonstreren hoe je een gelinkte lijst kan opstellen in C#. We gaan een klasse schrijven, die een gelijkaardige functionaliteit heeft als een ArrayList, namelijk
Nadere informatieDergelijke functionaliteit kunnen we zelf ook aan eigen code toevoegen.
Indexers in C#.Net In deze tutorial ga ik het hebben over indexers. Bij het gebruik van bijvoorbeeld een ArrayList object, kan je de gegevens uit deze collectie opvragen als ware het een array. // ArrayList
Nadere informatieFile Uploads met standaard ASP.NET
File Uploads met standaard ASP.NET In deze tutorial gaan we een aspx pagina maken (met codebehind), waarmee je een bestand kan uploaden naar de webserver. Noot: de hier beschreven code gaat niet in op
Nadere informatieDatatypes Een datatype is de sort van van een waarde van een variabele, veel gebruikte datatypes zijn: String, int, Bool, char en double.
Algemeen C# Variabele Een variabele is een willekeurige waarde die word opgeslagen. Een variabele heeft altijd een datetype ( De soort waarde die een variabele bevat). Datatypes Een datatype is de sort
Nadere informatieZelftest Programmeren in Java
Zelftest Programmeren in Java Document: n0883test.fm 22/01/2013 ABIS Training & Consulting P.O. Box 220 B-3000 Leuven Belgium TRAINING & CONSULTING INLEIDING BIJ DE ZELFTEST PROGRAMMEREN IN JAVA Deze test
Nadere informatieStreams, Formatters en Serialization in.net (Tutorial gebaseerd op tutorials van Richard Grimes, het MSDN en anderen)
Streams, Formatters en Serialization in.net (Tutorial gebaseerd op tutorials van Richard Grimes, het MSDN en anderen) In deze tutorial ga ik in op het gebruik van Streams, Formatters en Serialization.
Nadere informatieLezen van en schrijven naar het Windows Registry
Lezen van en schrijven naar het Windows Registry 1. Inleiding Ik ga uit van de veronderstelling dat je wel zo ongeveer weet wat het Registry is bij het windows besturingssysteem. Als je het niet weet,
Nadere informatieVisual Basic.NET. Visual Basic.NET. M. den Besten 0.3 VB. NET
Visual Basic.NET M. den Besten 0.3 VB. NET Inhoud Voorwoord Deel 1 Visual Basic.NET 1.1 Inleiding...13 1.2 De programmeertaal Visual Basic.NET...14 1.3 Microsoft Visual Basic 2010 Express Edition...15
Nadere informatieFlexibele oplossing om de eid kaart aan te spreken vanuit.net (en Delphi, Visual Basic, C++ etc)
Productfiche RoadByte eid Framework Flexibele oplossing om de eid kaart aan te spreken vanuit.net (en Delphi, Visual Basic, C++ etc) RoadByte BVBA stelt het RoadByte eid Framework product voor. Dit framework
Nadere informatieUitwerking Tweede deeltentamen Imperatief programmeren - versie 1 Vrijdag 21 oktober 2016, uur
Uitwerking Tweede deeltentamen Imperatief programmeren - versie 1 Vrijdag 21 oktober 2016, 13.00-15.00 uur 1. De situatie die ontstaat door class A : B C D; kan beschreven worden door (a) B is een A (b)
Nadere informatieObject Oriented Programming
Object Oriented Programming voor webapplicaties Door Edwin Vlieg Waarom OOP? Basis uitleg over OOP Design Patterns ActiveRecord Model View Controller Extra informatie Vragen OOP Object Oriented Programming
Nadere informatieModelleren en Programmeren
Modelleren en Programmeren Jeroen Bransen 6 december 2013 Terugblik Programma en geheugen Opdrachten Variabelen Methoden Objecten Klasse Programma en geheugen Opdrachten Variabelen zijn gegroepeerd in
Nadere informatieWerken met ActiveX (COM) componenten in.net
Werken met ActiveX (COM) componenten in.net 1. Inleiding In de pre-net dagen werd gebruik gemaakt van COM (of ActiveX) objecten, gelijkaardig aan hoe we nu een Windows Control Library of Web Control Library
Nadere informatieUitwerkingen Tweede deeltentamen Imperatief programmeren Vrijdag 15 oktober 2010, 11.00-13.00 uur
Uitwerkingen Tweede deeltentamen Imperatief programmeren Vrijdag 15 oktober 2010, 11.00-13.00 uur 1. (2 punten per deelvraag) Deze opgave bestaat uit een aantal tekstvragen. Houd het antwoord kort: een
Nadere informatieUniversiteit van Amsterdam FNWI. Voorbeeld van tussentoets Inleiding programmeren
Universiteit van Amsterdam FNWI Voorbeeld van tussentoets Inleiding programmeren Opgave 1: Wat is de uitvoer van dit programma? public class Opgave { static int i = 0 ; static int j = 1 ; int i = 1 ; int
Nadere informatieTentamen Objectgeorienteerd Programmeren
Tentamen Objectgeorienteerd Programmeren 5082IMOP6Y maandag 16 november 2015 13:00 15:00 Schrijf je naam en studentnummer op de regel hieronder. Sla deze pagina niet om tot de surveillant vertelt dat het
Nadere informatieNSPYRE LEGO MINDSTORMS UITDAGING (JAVA) INLEIDING. DOEL: SIMULATOR:
NSPYRE LEGO MINDSTORMS UITDAGING (JAVA) INLEIDING. Door mee te doen aan deze uitdaging kan je Nspyre laten zien wat je kan. Schrijf jij de beste oplossing dan is deze lego mindstorms nxt 2.0 set voor jou.
Nadere informatieVersturen van email vanuit een Delphi VCL toepassing
Versturen van email vanuit een Delphi VCL toepassing Voor Delphi bestaan uiteraard verschillende libraries om emails te versturen, maar in dit voorbeeld wordt een C# Dotnet library gebruikt en aangesproken
Nadere informatieMyDHL+ Van Non-Corporate naar Corporate
MyDHL+ Van Non-Corporate naar Corporate Van Non-Corporate naar Corporate In MyDHL+ is het mogelijk om meerdere gebruikers aan uw set-up toe te voegen. Wanneer er bijvoorbeeld meerdere collega s van dezelfde
Nadere informatieTentamen Object Georiënteerd Programmeren TI1206 29 oktober 2014, 9.00-11.00 Afdeling SCT, Faculteit EWI, TU Delft
Tentamen Object Georiënteerd Programmeren TI1206 29 oktober 2014, 9.00-11.00 Afdeling SCT, Faculteit EWI, TU Delft Bij dit tentamen mag je geen gebruik maken van hulpmiddelen zoals boek of slides. Digitale
Nadere informatieEen eerste applicatie
Een eerste applicatie 2.1 Inleiding Programmeren in Visual Basic.NET doe je niet alleen door regels met code te schrijven. Je begint met het ontwerpen van een venster in de design mode met allerlei controls,
Nadere informatieDIAGNOSTISCHE TOETS Softwaresystemen UITWERKING
DIAGNOSTISCHE TOETS Softwaresystemen datum: Donderdag van Week 7 UITWERKING Deze diagnostische toets bevat vragen over excepties en concurrency. Beantwoord de vragen zo goed mogelijk in 30 minuten Bespreek
Nadere informatieMaak een pivot uit een Generic.List
Maak een pivot uit een Generic.List Introductie in extensions, reflection en code generation Nivo: 400 Introductie In bepaalde gevallen komt het voor dat je een Generic.List van een specifieke class hebt,
Nadere informatieINFORMATICA 1STE BACHELOR IN DE INGENIEURSWETENSCAPPEN
INFORMATICA 1STE BACHELOR IN DE INGENIEURSWETENSCAPPEN voorbeeldexamen NAAM :... OPMERKINGEN VOORAF Je krijgt 3 uur de tijd om de opdrachten voor dit examen uit te voeren. Verder werken aan je oplossing
Nadere informatieInformatica. Objectgeörienteerd leren programmeren. Van de theorie met BlueJ tot een spelletje met Greenfoot... Bert Van den Abbeele
Informatica Objectgeörienteerd leren programmeren Van de theorie met BlueJ tot een spelletje met Greenfoot... Bert Van den Abbeele http://creativecommons.org/licenses/by-nc-nd/3.0/legalcode Objectgeörienteerd
Nadere informatieKleine cursus PHP5. Auteur: Raymond Moesker
Kleine cursus PHP5 Auteur: Raymond Moesker Kleine cursus PHP PHP is platform en CPU onafhankelijk, open source, snel, heeft een grote userbase, het is object georiënteerd, het wordt omarmd door grote bedrijven
Nadere informatieInformatica: C# WPO 2
Informatica: C# WPO 2 1. Inhoud If, globale variabelen, debuggen, randomgetallen, strings vergelijken 2. Oefeningen Demo 1: Deelbaar door 0 Demo 2: Kassa Demo 3: Debug oplossingen demo s 1 en 2 A: Verschillend
Nadere informatieTeamhandleiding DOMjudge (versie 2.2.0muKP) 31 mei 2008
judge Teamhandleiding DOMjudge (versie..0mukp) 31 mei 008 /\ DOM DOM judge Inhoudsopgave 1 Inleiding Samenvatting.1 Inlezen en wegschrijven............................... Insturen van oplossingen...............................3
Nadere informatieDieper in Visual Basic.Net
Visual Basic.NET Dieper in Visual Basic.Net 7.1 Inleiding Dit hoofdstuk is bedoeld om je wat handiger te maken in het programmeren in Visual Basic. Je leert geen nieuwe programmeervaardigheden, maar je
Nadere informatieOpdrachten herhalen. public void tekenscherm (object o, PEA pea) { int x; x = 1; zolang de voorwaarde geldig is
Opdrachten herhalen public void tekenscherm (object o, PEA pea) { int x; x = 1; while ( x
Nadere informatieModelleren en Programmeren
Modelleren en Programmeren Jeroen Bransen 25 november 2015 Herhaling Meer herhaling Recursie Mutuele recursie Objecten Herhaling Fibonacci class Fibonacci { public static void fibonaccitot(int bovengrens)
Nadere informatieModelleren en Programmeren
Modelleren en Programmeren Jeroen Bransen 27 november 2015 Recursie Objecten Constructors Aanpassen variabelen this keyword Recursie Recursie Recursieve functie roept zichzelf (direct of indirect) aan
Nadere informatieHandleiding Installatie ADS
Handleiding Installatie ADS Versie: 1.0 Versiedatum: 19-03-2014 Inleiding Deze handleiding helpt u met de installatie van Advantage Database Server. Zorg ervoor dat u bij de aanvang van de installatie
Nadere informatieUitwerking Aanvullend tentamen Imperatief programmeren Woensdag 24 december 2014, 13.30 15.30 uur
Uitwerking Aanvullend tentamen Imperatief programmeren Woensdag 24 december 2014, 13.30 15.30 uur 1. deze opgave telt voor 30% van het totaal. Schrijf een compleet programma, dat door de gebruiker vanaf
Nadere informatieModelleren en Programmeren
Modelleren en Programmeren Jeroen Bransen 18 december 2015 Overerving (inheritance) Constructors Overriding Inheritance demo Exceptions Zelf exceptions veroorzaken Overerving (inheritance) 2-dimensionaal
Nadere informatieASP.NET Test 2009-2010. Jan Van Ryckeghem
ASP.NET Test 2009-2010 Jan Van Ryckeghem Inhoud Exceptionhandling H4... 3 Try Catch slide 25... 3 Error pagina slide 29... 3 Error.aspx... 3 Error.aspx.cs... 4 Web.config... 4 Logbestand aanmaken... 4
Nadere informatieDOMjudge teamhandleiding
judge DOMjudge teamhandleiding Samenvatting /\ DOM DOM judge Hieronder staat de belangrijkste informatie kort samengevat. Dit is bedoeld om snel aan de slag te kunnen. We raden echter ten zeerste aan dat
Nadere informatieTentamen Imperatief Programmeren
Tentamen Imperatief Programmeren Maandag 22 oktober 2001 Toelichting Dit is een open boek tentamen, d.w.z. het cursusboek mag gebruikt worden. N.B.: Het tentamen is individueel: voor het maken van de opgaven
Nadere informatievbg.vbnet.beginner Foutafhandeling binnen Visual Basic.NET
Fouten in software zijn onwenselijk, maar bijna niet te voorkomen. Er zijna namelijk zaken waar uw software geen invloed op uit kan oefenen. Het verbreken van een netwerkverbinding is een voorbeeld hiervan.
Nadere informatieEven 20 jaar terug in de tijd. Ik zit op m n Commodore Amiga
Mark Blomsma is medeoprichter van en softwarearchitect bij Omnext.NET bv. Threading: synchroon versus asynchroon H E T I N Z E T T E N VA N M U LT I -T H R E A D I N G Multi-threading kan je gebruiken
Nadere informatieMijn eerste ADO.NET applicatie
Hoofdstuk 2 Mijn eerste ADO.NET applicatie ADO staat voor ActiveX Database Objects. Dit is een verzameling klassen die onderdeel uitmaken van het.net framework, waarmee je verbinding kunt maken met een
Nadere informatieVariabelen en statements in ActionScript
Ontwikkelen van Apps voor ios en Android Variabelen en statements in ActionScript 6.1 Inleiding Als we het in de informatica over variabelen hebben, bedoelen we een stukje in het geheugen van de computer
Nadere informatieProgrammeren in C# Exceptions. Hoofdstuk 17
Programmeren in C# Exceptions Hoofdstuk 17 In dit hoofdstuk Wat is een exception? Waarom zijn ze nuttig? De C# exception faciliteiten. Programmeren in C# 2 Overzicht Inleiding Try-Catch Combinatie Catch
Nadere informatieICARUS Illumina E653BK on Windows 8 (upgraded) how to install USB drivers
ICARUS Illumina E653BK on Windows 8 (upgraded) how to install USB drivers English Instructions Windows 8 out-of-the-box supports the ICARUS Illumina (E653) e-reader. However, when users upgrade their Windows
Nadere informatieOvererving & Polymorfisme
Overerving & Polymorfisme Overerving Sommige klassen zijn speciaal geval van andere klasse Docent is een speciaal geval van werknemer, dwz. elke docent is ook werknemer Functionaliteit van docent = functionaliteit
Nadere informatieContents. Introduction Problem Definition The Application Co-operation operation and User friendliness Design Implementation
TeleBank Contents Introduction Problem Definition The Application Co-operation operation and User friendliness Design Implementation Introduction - TeleBank Automatic bank services Initiates a Dialog with
Nadere informatieChris de Kok 223548 TDI 3. Vak: Software Architectuur Datum: 21-01-2008 Docent: Fons van Kesteren
Chris de Kok 223548 TDI 3 Vak: Software Architectuur Datum: 21-01-2008 Docent: Fons van Kesteren Inhoud Inleiding... 3 Black box / White box... 3 XP... 3 SimpleTest... 3 Eclipse plugin... 4 GroupTest...
Nadere informatieVersie 2: B C D D A C D A C C. Versie 3: C D A A B D A B D D. Versie 4: A D C C B D C B D D. Versie 5: B A D D C A D C A A
Uitwerking Tweede deeltentamen Mobiel programmeren - versie 1 Vrijdag 1 februari 2019, 11.00 13.00 uur Voor de meerkeuzevragen hebben we verschillende versies. Dit zijn de juiste antwoorden per versie.
Nadere informatieProgrammeren 3. 1. Het gesloten boek examen 1.1
Programmeren 3 1. Het gesloten boek examen Het gesloten boek examen bestaat uit meerkeuzevragen of vragen waarin gevraagd wordt een stukje code te schrijven of om het resultaat van een stuk code te voorspellen.
Nadere informatieParallelle Poort Aansturen Met Visual Basic
Parallelle Poort Aansturen Met Visual Basic 1. Waarom? (Voor Beginners) Er zijn geregeld vragen over hoe je nu eigenlijk een parallelle poort moet aansturen. Op het internet is heel wat te vinden, maar
Nadere informatieALGORITMIEK: answers exercise class 7
Problem 1. See slides 2 4 of lecture 8. Problem 2. See slides 4 6 of lecture 8. ALGORITMIEK: answers exercise class 7 Problem 5. a. Als we twee negatieve (< 0) getallen bij elkaar optellen is het antwoord
Nadere informatieRelease Notes. Afdrukdatum: 2008/11/13
Release Notes Afdrukdatum: 2008/11/13 Dit document beschrijft vanuit technisch oogpunt de aanpassingen in Hi-Ant aan de betreffende versie. Deze tekst is geenszins bedoeld als document naar de eindgebruiker,
Nadere informatieVoorbeeld: Simulatie van bewegende deeltjes
Voorbeeld: Simulatie van bewegende deeltjes Simulatie - object Ruimte - objecten Deeltje - objecten Button - objecten Simulatie Samenhang van objecten sim geërfd van Form stap zelf gedeclareerd auto r1
Nadere informatieVoor de database wordt een Access 2000 bestand gebruikt, met voorlopig 1 tabel:
Eenvoudig voorbeeld. Er wordt verondersteld dat er met VS 2008 EXPRESS gewerkt wordt. Voor de database wordt een Access 2000 bestand gebruikt, met voorlopig 1 tabel: (Sommige schermafdrukken zijn afkomstig
Nadere informatieKlassen & objecten, overerving, abstracte klassen, debuggen, interfaces, formulieren, polymorfie, statische methoden, event-handlers
1 Inhoud Klassen & objecten, overerving, abstracte klassen, debuggen, interfaces, formulieren, polymorfie, statische methoden, event-handlers 2 Geluidsbronnen simulator, deel 2 Inleiding De weergave versnellen
Nadere informatieIngebouwde klassen & methodes
Ingebouwde klassen & methodes Statische methodes Methodes die bij een klasse horen ipv. bij een object public class Docent { public static Docent departementshoofd() { return new Docent("Jan Ivens"); private
Nadere informatieDatum, Tijd en Timer-object
IX. Datum, Tijd en Timer-object A. Hoe worden tijd en datum in VB aangeduid? Zowel datum als tijd worden als een getal met decimalen opgeslagen. Het gedeelte voor de komma geeft de datum aan, het gedeelte
Nadere informatieInleiding C++ Coding Conventions
Inleiding C++ Coding Conventions Opleiding Bachelor of Science in Informatica, van de Faculteit Wetenschappen, Universiteit Antwerpen. Nota s bij de cursus voor academiejaar 2012-2013. Ruben Van den Bossche,
Nadere informatieReal-Time Software (RTSOF) EVMINX9 Week 2
Real-Time Software (RTSOF) EVMINX9 Week 2 C++ Threads C++ heeft (nog) geen standaard library voor concurrent programmeren. Boost Thread library http://www.boost.org/ Intel Threading Building Blocks (TBB)
Nadere informatieSettings for the C100BRS4 MAC Address Spoofing with cable Internet.
Settings for the C100BRS4 MAC Address Spoofing with cable Internet. General: Please use the latest firmware for the router. The firmware is available on http://www.conceptronic.net! Use Firmware version
Nadere informatieHet relaas van de beginnende programmeur. Het hoe en waarom van de assistent
Het relaas van de beginnende programmeur Het hoe en waarom van de assistent 1. Help, mijn code doet niks... Mogelijke oplossingen: Heb je op run geduwd (groene pijltje)? Zolang je niet op 'run' duwt, kent
Nadere informatieJShell in Java 9 - De eerste officiële Java REPL
WHITEBOOK JShell in Java 9 - De eerste officiële Java REPL Augustus 2017 Auteur: Martijn van de Goor INTEGRATIESPECIALIST Inleiding Het is bijna zover! Java SE 9 wordt op 21 september uitgebracht. Java
Nadere informatieUitwerking Tentamen Modelleren en Programmeren - versie 1 Woensdag 1 februari 2017, uur
Uitwerking Tentamen Modelleren en Programmeren - versie 1 Woensdag 1 februari 2017, 17 20 uur Schrijf op elk ingeleverd blad je naam. Schrijf op het eerste blad ook je studentnummer en het aantal ingeleverde
Nadere informatieVereiste kennis. 1 Java-editor. 2 Het compileren van een programma
3 Vereiste kennis Dit boek richt zich op het leren programmeren door het oefenen met programmeercodes. Veel theorie komt in het begin niet aan de orde. Dat is een grote uitdaging want het is niet makkelijk
Nadere informatieOpdracht 7a. Applicatiebouw 2014/2015
Applicatiebouw 2014/2015 Opdracht 7a Inhoud Applicatiebouw op dag 7 College In het college wordt oa. overerving behandeld, waarmee je uit een bestaande klasse een nieuwe andere klasse kan maken. Ook zijn
Nadere informatieDatastructuren Werkcollege Intro
Bart Hijmans, Universiteit Leiden. Universiteit Leiden The Netherlands Focus 1 19 ˆ Ervaring in gebruik en implementatie van datastructuren ˆ Kennis van mogelijkheden ˆ Programmeren voor andere programmeurs
Nadere informatieUitwerking Tentamen Modelleren en Programmeren - versie 1 Woensdag 1 februari 2017, uur
Uitwerking Tentamen Modelleren en Programmeren - versie 1 Woensdag 1 februari 2017, 17 20 uur Schrijf op elk ingeleverd blad je naam. Schrijf op het eerste blad ook je studentnummer en het aantal ingeleverde
Nadere informatieVeel succes! 1. Deze opgave bestaat uit een aantal vragen. Houd het antwoord kort: één of twee zinnen per onderdeel kan al genoeg zijn.
Eerste deeltentamen Gameprogrammeren Vrijdag 26 september 2014, 8.30-10.30 uur Naam: Studentnummer: Het tentamen bestaat uit 4 opgaven. Elke opgave levert 10 punten op. Je cijfer is het totaal aantal punten
Nadere informatieTentamen Object Georiënteerd Programmeren TI1200 30 januari 2013, 9.00-12.00 Afdeling SCT, Faculteit EWI, TU Delft
Tentamen Object Georiënteerd Programmeren TI1200 30 januari 2013, 9.00-12.00 Afdeling SCT, Faculteit EWI, TU Delft Bij dit tentamen mag je geen gebruik maken van hulpmiddelen zoals boek of slides. Dit
Nadere informatieModelleren en Programmeren
Modelleren en Programmeren Jeroen Bransen 11 december 2015 Ingebouwde datastructuren Meer boomstructuren Access specifiers Gebruikersinvoer Codestijl Packages SAT-solver Ingebouwde datastructuren Ingebouwde
Nadere informatieHier volgt als hulp wat technische informatie voor de websitebouwer over de werking van de xml web service.
WEB SERVICE WERKING Hier volgt als hulp wat technische informatie voor de websitebouwer over de werking van de xml web service. Aanvullende informatie omtrent de fieldmapping kunt u hier inzien: www.effector.nl/webservice/technischeuitlegfieldmapping.xls
Nadere informatieProgrammeerstructuren met App Inventor
Programmeerstructuren met App Inventor Kevin Krul, Universiteit Utrecht Roncalli, Bergen op Zoom Inhoud: Les 1: Introductie tot App Inventor, when statement en variabelen. Les 2: Introductie if-statement
Nadere informatieKwis (3) class X { public void a() { System.out.println("x"); public static void main(string[] args) { X x = new X();
Kwis (3) class X { public void a() { System.out.println("x"); class Y extends X { public void a() { System.out.println("y"); class Z extends Y { public void a() { System.out.println("z"); public static
Nadere informatieJava Programma structuur
Java Programma structuur public class Bla // div. statements public static void main(string argv[]) // meer spul Voortgezet Prog. voor KI, week 4:11 november 2002 1 Lijsten Voorbeelden 2, 3, 5, 7, 13 Jan,
Nadere informatieFOR DUTCH STUDENTS! ENGLISH VERSION NEXT PAGE
FOR DUTCH STUDENTS! ENGLISH VERSION NEXT PAGE Tentamen Bewijzen en Technieken 1 7 januari 211, duur 3 uur. Voeg aan het antwoord van een opgave altijd het bewijs, de berekening of de argumentatie toe.
Nadere informatieObjectgericht programmeren 1.
Objectgericht programmeren 1 joost.vennekens@kuleuven.be http://www.cs.kuleuven.be/~joost/dn Objectgericht ontwerpen 35% Objectgericht ontwerpen 65% OP1 Informatiesystemen 50% Databanken 50% OP1 Evaluatie
Nadere informatieVisual Basic 2005 nieuwe taalelementen André Obelink, MCSD, MVP
Visual Basic 2005 nieuwe taalelementen André Obelink, MCSD, MVP Auteur, VBcentral.nl Microsoft MVP Visual Basic VP Speakers Bureau INETA Europe - www.europe.ineta.org www.vbcentral.nl - www.obelink.com
Nadere informatieEen unit test is geen integratie test. Niet het hele systeem, maar onderdelen van een systeem worden getest.
WAT IS EEN UNIT TEST? Een unit test is een test om de functionaliteit van stukken code te controleren. Een goede unit test waarborgt een consistente werking van een klein onderdeel (een unit ) van de broncode.
Nadere informatieNHibernate als ORM oplossing
NHibernate als ORM oplossing Weg met de SQL Queries Wat is ORM? ORM staat in dit geval voor Object Relational Mapping, niet te verwarren met Object Role Modeling. ORM vertaalt een objectmodel naar een
Nadere informatieTentamen Objectgeorienteerd Programmeren IN1205 Voorbeeld
Tentamen Objectgeorienteerd Programmeren IN1205 Voorbeeld Afdeling ST Faculteit EWI TU Delft Bij dit tentamen mag u gebruik maken van: Barnes, Object-Oriented Programming with Java en de Notitie Algoritmiek
Nadere informatieOmschrijf bij ieder onderdeel van de methode de betekenis ervan. Java kent twee groepen van klassen die een GUI kunnen maken: awt en swing.
irkel (met Jpanel) ij de onderstaande opdracht behoort het bestand Panels: JPanels_1.java (map Panel) in de map irkel. pplicaties in Java hebben altijd een publieke klasse waarin een methode main voorkomt.
Nadere informatieInleiding Software Engineering! Unit Testing, Contracten, Debugger! 13 Februari 2014!
Inleiding Software Engineering Unit Testing, Contracten, Debugger 13 Februari 2014 Beknopte info over Unit Testing en Contracten kan je vinden op het einde van dit document. Eclipse beschikt over een handige
Nadere informatieUnit testen met Rhino mocks Twee handen op één buik
Unit testen met Rhino mocks Twee handen op één buik Sinds Kent Beck in 2000 zijn meesterwerk 'Extreme Programming Explained' schreef, weet iedere ontwikkelaar dat gedegen testen van software noodzakelijk
Nadere informatieDynamiek met VO-Script
Dynamiek met VO-Script Door Bert Dingemans DLA Ontwerp & Software bert@dla-architect.nl Inleiding Op de SDGN nieuwsgroep voor Visual Objects ontstond laatst een draad van berichten over de nieuwe libraries
Nadere informatieJavascript oefenblad 1
Leer de basis van Javascript. Javascript oefenblad 1 Niels van Velzen Javascript oefenblad 1 Pagina 2 Inleiding Javascript is niet altijd even makkelijk. Vooral aan het begin is het even wennen hoe de
Nadere informatieLeren programmeren in C# Deel 2 - Gegevens
Michiel Rotteveel Leren programmeren in C# Deel 2 - Gegevens Errata 1e druk Brinkman Uitgeverij Amsterdam 2017 Deze errata horen bij Leren programmeren in C#: Deel 2 Gegevens, isbn 978 90 5752 342 7 /
Nadere informatieVakgroep CW KAHO Sint-Lieven
Vakgroep CW KAHO Sint-Lieven Objecten Programmeren voor de Sport: Een inleiding tot JAVA objecten Wetenschapsweek 20 November 2012 Tony Wauters en Tim Vermeulen tony.wauters@kahosl.be en tim.vermeulen@kahosl.be
Nadere informatieRECEPTEERKUNDE: PRODUCTZORG EN BEREIDING VAN GENEESMIDDELEN (DUTCH EDITION) FROM BOHN STAFLEU VAN LOGHUM
Read Online and Download Ebook RECEPTEERKUNDE: PRODUCTZORG EN BEREIDING VAN GENEESMIDDELEN (DUTCH EDITION) FROM BOHN STAFLEU VAN LOGHUM DOWNLOAD EBOOK : RECEPTEERKUNDE: PRODUCTZORG EN BEREIDING VAN STAFLEU
Nadere informatieIn de tweede regel plaatsen we in het gereserveerde stukje geheugen een getal.
4. Array s Een array is een geïndexeerde variabele. Deze zin zal de nodig vragen oproepen, waarop enige uitleg van toepassing is. Met variabelen hebben we al kennis gemaakt. In een variabele kun je iets
Nadere informatieHOOFDSTUK 3. Imperatief programmeren. 3.1 Stapsgewijs programmeren. 3.2 If Then Else. Module 4 Programmeren
HOOFDSTUK 3 3.1 Stapsgewijs programmeren De programmeertalen die tot nu toe genoemd zijn, zijn imperatieve of procedurele programmeertalen. is het stapsgewijs in code omschrijven wat een programma moet
Nadere informatieAnalyse KeyLock versie 1.1.1 Door MartinJM 08-12-2014
Analyse KeyLock versie 1.1.1 Door MartinJM 08-12-2014 Openbare versie Inleiding Dit document bestaat uit meerdere delen. Voornamelijk de verschillende problemen zijn onderverdeeld in verschillende kopjes.
Nadere informatieDerde deeltentamen Imperatief programmeren - versie 1 Vrijdag 9 november 2018, uur
Derde deeltentamen Imperatief programmeren - versie 1 Vrijdag 9 november 2018, 11.00-13.00 uur Schrijf op elk ingeleverd blad je naam. Schrijf op het eerste blad ook je studentnummer en het aantal ingeleverde
Nadere informatieMyDHL+ ProView activeren in MyDHL+
MyDHL+ ProView activeren in MyDHL+ ProView activeren in MyDHL+ In MyDHL+ is het mogelijk om van uw zendingen, die op uw accountnummer zijn aangemaakt, de status te zien. Daarnaast is het ook mogelijk om
Nadere informatieAls een PSD selecties bevat, deelt de lijn van het programma zich op met de verschillende antwoorden op het vraagstuk.
HOOFDSTUK 3 3.1 Stapsgewijs programmeren In de vorige hoofdstukken zijn programmeertalen beschreven die imperatief zijn. is het stapsgewijs in code omschrijven wat een programma moet doen, net als een
Nadere informatieProgrammeren in C# Samenvatting van C#
Programmeren in C# Samenvatting van C# Proceduraal Programmeren Functies (O: void + return, I: referentie of value) Arrays, Lijsten Lussen (for, while, do while) Condities, if-else, switch Variabelen,
Nadere informatieHoe met Windows 8 te verbinden met NDI Remote Office (NDIRO) How to connect With Windows 8 to NDI Remote Office (NDIRO
Handleiding/Manual Hoe met Windows 8 te verbinden met NDI Remote Office (NDIRO) How to connect With Windows 8 to NDI Remote Office (NDIRO Inhoudsopgave / Table of Contents 1 Verbinden met het gebruik van
Nadere informatieHet beheren van mijn Tungsten Network Portal account NL 1 Manage my Tungsten Network Portal account EN 14
QUICK GUIDE C Het beheren van mijn Tungsten Network Portal account NL 1 Manage my Tungsten Network Portal account EN 14 Version 0.9 (June 2014) Per May 2014 OB10 has changed its name to Tungsten Network
Nadere informatieModelleren en Programmeren
Modelleren en Programmeren Jeroen Bransen 13 december 2013 Terugblik Fibonacci public class Fibonacci { public static void main(string[] args) { // Print het vijfde Fibonaccigetal System.out.println(fib(5));
Nadere informatie