Rinnakkaisuus (.NET) Juha Järvensivu 2007

Samankaltaiset tiedostot
Rinnakkaisuus. Juha Järvensivu 2008

Tapahtumapohjainen ohjelmointi. Juha Järvensivu 2007

Graafisen käyttöliittymän ohjelmointi Syksy 2013

10 Lock Lock-lause

Projekti 1 Säikeet ja kriittisen vaiheen kontrollointi javalla

RINNAKKAINEN OHJELMOINTI A,

Graafisen käyttöliittymän ohjelmointi

Delegaatit ja tapahtumakäsittelijät

Rinnakkaisohjelmointi kurssi. Opintopiiri työskentelyn raportti

Tapahtumapohjainen ohjelmointi. Juha Järvensivu 2008

C# ja.net. Juha Järvensivu 2007

Mikä yhteyssuhde on?

Rajapinta (interface)

1.3 Lohkorakenne muodostetaan käyttämällä a) puolipistettä b) aaltosulkeita c) BEGIN ja END lausekkeita d) sisennystä

C++11 seminaari, kevät Johannes Koskinen

Kompositio. Mikä komposition on? Kompositio vs. yhteyssuhde Kompositio Javalla Konstruktorit set-ja get-metodit tostring-metodi Pääohjelma

Asynkroninen ohjelmointi.net 4.5 versiolla

Lohkot. if (ehto1) { if (ehto2) { lause 1;... lause n; } } else { lause 1;... lause m; } 15.3

Lohkot. if (ehto1) { if (ehto2) { lause 1;... lause n; } } else { lause 1;... lause m; } 16.3

1. Omat operaatiot 1.1

1.3Lohkorakenne muodostetaan käyttämällä a) puolipistettä b) aaltosulkeita c) BEGIN ja END lausekkeita d) sisennystä

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

public static void main (String [] args)

14. Poikkeukset 14.1

812336A C++ -kielen perusteet,

Listarakenne (ArrayList-luokka)

Vertailulauseet. Ehtolausekkeet. Vertailulauseet. Vertailulauseet. if-lauseke. if-lauseke. Javan perusteet 2004

XNA grafiikka laajennus opas. Paavo Räisänen. Tämän oppaan lähdekoodit ovat ladattavissa näiden sivujen Ladattavat osiossa.

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista

Suunnittelumalleja, MVC. Juha Järvensivu 2008

Tapahtumapohjainen ohjelmointi

Tehtävä 1. Tehtävä 2. Arvosteluperusteet Koherentti selitys Koherentti esimerkki

Tech Conference Visual Studio 2015, C#6,.NET4.6. Heikki Raatikainen. #TechConfFI

Salasanan vaihto uuteen / How to change password

Lista luokan sisällä

14. Poikkeukset 14.1

Olio-ohjelmointi Javalla

Java ja grafiikka. Ville Sundberg

Toisessa viikkoharjoituksessa on tavoitteena tutustua JUnit:lla testaukseen Eclipse-ympäristössä.

Osa IV. Vaativampi C# Copyright IT Press Tämän e-kirjan kopiointi, tulostaminen ja jakeleminen eteenpäin luvatta on kielletty.

Ohjelmointi 2 / 2010 Välikoe / 26.3

5. HelloWorld-ohjelma 5.1

FinFamily PostgreSQL installation ( ) FinFamily PostgreSQL

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

Luento 6. T Ohjelmoinnin jatkokurssi T1 & T Ohjelmoinnin jatkokurssi L1. Luennoitsija: Otto Seppälä

5 Näppäimistö. 5.1 Näppäimistön eventit

T Henkilökohtainen harjoitus: FASTAXON

Metodien tekeminen Javalla

20. Javan omat luokat 20.1

Windowsin sanomanvälitys. Juha Järvensivu 2007

Sisällys. 20. Javan omat luokat. Java API. Pakkaukset. java\lang

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?

HSMT Tietokannoista. Ville Leppänen. HSMT, c Ville Leppänen, IT, Turun yliopisto, 2008 p.1/32

Concurrency - Rinnakkaisuus. Group: 9 Joni Laine Juho Vähätalo

On instrument costs in decentralized macroeconomic decision making (Helsingin Kauppakorkeakoulun julkaisuja ; D-31)

Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma.

Ohjelmointi 2 / 2008 Välikoe / Pöytätestaa seuraava ohjelma.

Microsoft Visual Studio 2005

Rinnakkaisohjelmointi, Syksy 2006

Sisällys. 15. Lohkot. Lohkot. Lohkot

17. Javan omat luokat 17.1

Poikkeustenkäsittely

Tietorakenteet ja algoritmit

5. HelloWorld-ohjelma 5.1

.NET ajoympäristö. Juha Järvensivu 2007

Sisältö. 22. Taulukot. Yleistä. Yleistä

11. Javan valintarakenteet 11.1

Qt perusteet. Juha-Matti Vanhatupa. (vanhan kurssin Graafisen käyttöliittymän ohjelmointi materiaalia)

FinFamily Installation and importing data ( ) FinFamily Asennus / Installation

Sisällys. 6. Metodit. Oliot viestivät metodeja kutsuen. Oliot viestivät metodeja kutsuen

JAVA-OHJELMOINTI 3 op A274615

Sisällys. 12. Näppäimistöltä lukeminen. Yleistä. Yleistä

Modernit sovellukset ja asynkronisuus Heikki Raatikainen

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Poikkeukset ja tietovirrat: Virhetilanteiden ja syötevirtojen käsittely

On instrument costs in decentralized macroeconomic decision making (Helsingin Kauppakorkeakoulun julkaisuja ; D-31)

Sisältö. 2. Taulukot. Yleistä. Yleistä

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä. Tiedonkätkentä. Aksessorit. 4.2

YHTEYSSUHDE (assosiation)

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2

8. Näppäimistöltä lukeminen 8.1

4. Luokan testaus ja käyttö olion kautta 4.1

Attribuutit. Copyright IT Press Tämän e-kirjan kopiointi, tulostaminen ja jakeleminen eteenpäin luvatta on kielletty.

Java-kielen perusteet

Object Framework - One. OF-1 is a high-productive Multi-UI OpenEdge data driven development framework. Veli-Matti Korhonen

Javan semaforit. Joel Rybicki, Aleksi Nur mi, Jara Uitto. Helsingin yliopisto

1 Tehtävän kuvaus ja analysointi

12. Näppäimistöltä lukeminen 12.1

1. Kun käyttäjä antaa nollan, niin ei tulosteta enää tuloa 2. Hyväksy käyttäjältä luku vain joltain tietyltä väliltä (esim tai )

Ohjelmistotekniikan menetelmät, koe

19. Olio-ohjelmointia Javalla 19.1

Tehtävä 1. Tietojen lisääminen, poistaminen, päivittäminen ja tulostaminen

8. Näppäimistöltä lukeminen 8.1

Luokan sisällä on lista

12. Javan toistorakenteet 12.1

Olio-ohjelmointi Virhetilanteiden käsittely

Ohjelmoinnin peruskurssien laaja oppimäärä

BDD (behavior-driven development) suunnittelumenetelmän käyttö open source projektissa, case: SpecFlow/.NET.

Javan perusteita. Janne Käki

Metodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen

Transkriptio:

Rinnakkaisuus (.NET) Juha Järvensivu juha.jarvensivu@tut.fi 2007

Sisällys Rinnakkaisuus ja käyttöliittymäohjelmointi GUI-thread Asynkroninen delegaatti System.Timers.Timer Backgroundworker

Responsive GUI Käyttöliittymä ei missään tilanteessa jumiudu, vaan reagoi aina käyttäjän toimintoihin Käyttöliittymän tulee antaa palautetta pitkäkestoisten toimintojen aikana (esim progress bar)

GUI-thread

Prosessi vs Säie Prosessi Muistin suojauksen yksikkö, joka voi sisältää useita säikeitä jotka käyttävät samaa muistiavaruutta Säie Suorituksen yksikkö, joka ajetaan prosessin muistiavaruudessa

GUI-Thread Message queue Main Thread creates Worker thread Worker thread Worker thread

GUI-Thread Message queue Variable use Main Thread creates use Worker thread Worker thread Worker thread

System.Threading Foreground thread Mahdollisuus keskeyttää sovelluksen sulkeminen Ohjelma sulkeutuu vasta kun kaikkien Foregroundtyyppisten säikeiden suoritus on päättynyt. Background thread (daemon thread) Kun ohjelma suljetaan, myös kaikkien Background-säikeiden suoritus lopetaan automaattisesti

Esimerkki Thread secondarythread = new Thread( new ThreadStart(MyThreadProc) ); secondarythread.priority = ThreadPriority.Highest; secondarythread.isbackground = true; secondarythread.start(); static void MyThreadProc() // Säikeessä suoritettava koodi tänne

lock keyword Määrittelee koodilohkon, jonka suoritusta ei voida keskeyttää class WorkerClass public void DoSomeWork() lock(this) // Do some work

System.Threading.Monitor class WorkerClass public void DoSomeWork() try Monitor.Enter(this); // Do some work finally Monitor.Exit(this);

System.Monitor.Interlocked.NET:n aritmeettiset operaatiot eivät ole atomisia operaatioita! int i = 9; lock(this) i++; Interlocked.Increment(ref i);

Asynkroninen delegaatti

Synkroninen delegaatti class Program public delegate void MyDelegate(); public static void DoWork() for (int i = 0; i < 5; i++) Console.WriteLine("DoWork 0",i); Thread.Sleep(1000); static void Main(string[] args) MyDelegate d = new MyDelegate(DoWork); d(); Console.WriteLine("Done invoking delegate");

Asynkroninen delegaatti class Program public delegate void MyDelegate(); public static void DoWork() for (int i = 0; i < 5; i++) Console.WriteLine("DoWork 0",i); Thread.Sleep(1000); static void Main(string[] args) MyDelegate d = new MyDelegate(DoWork); IAsyncResult itfar = d.begininvoke(null, null); Console.WriteLine("Done invoking delegate "); int result = d.endinvoke(itfar); Console.WriteLine( delegate done");

Asynkroninen delegaatti class Program public delegate void MyDelegate(); public static void DoWork() for (int i = 0; i < 5; i++) Console.WriteLine("DoWork 0",i); Thread.Sleep(1000); public static void DoWorkCallback(IAsyncResult iftar) Console.WriteLine("delegate done"); static void Main(string[] args) MyDelegate d = new MyDelegate(DoWork); d.begininvoke(new AsyncCallback(DoWorkCallback), null); Console.WriteLine("Done invoking delegate "); // Estetään sovelluksen loppuminen Console.ReadLine();

Invoke-mekanismi

Control.Invoke Mahdollistaa UI-komponentin metodin kutsumisen toisesta säikeestä Toteutettu delegate mekanismin avulla Parametrina annettua delegaattifunktiota kutsutaan säikeestä, joka omistaa UIkomponentin

Virheellinen esimerkki! void StartThread() // Käynnistetään uusi säie Thread t = new Thread(new ThreadStart(DoSomeWork)); t.start(); void DoSomeWork() this.label1.text = Tehtävä valmis. Väärin!

Esimerkki private delegate void InvokeDelegate(); void StartThread() // Käynnistetään uusi säie Thread t = new Thread(new ThreadStart(DoSomeWork)); t.start(); private void Notify() this.label1.text = Tehtävä valmis. ; void DoSomeWork() // Toisessa säikeessä suoritettava koodi InvokeDelegate n = new InvokeDelegate(Notify); label1.invoke(n); Oikein

Timers Windows.Forms.Timers.Timer Windows based timer System.Timers.Timer Server based timer System.Threading.Timer Thread timers

System.Timers.Timer Ajetaan eri säikeessä kuin UI käytä invoke mekanismia UI-komponenttien päivittämiseen private System.Timers.Timer t = new Timer(); t.elapsed += new ElapsedEventHandler(t_Elapsed); void t_elapsed(object sender, ElapsedEventArgs e) InvokeDelegate n = new InvokeDelegate(Notify); label1.invoke(n); private void Notify() this.label1.text = "" + c1.value;

Background worker The BackgroundWorker class allows you to run an operation on a separate, dedicated thread. Time-consuming operations like downloads and database transactions can cause your user interface (UI) to seem as though it has stopped responding while they are running. When you want a responsive UI and you are faced with long delays associated with such operations, the BackgroundWorker class provides a convenient solution. Lähde: MSDN

Esimerkki private void InitializeBackgoundWorker() backgroundworker1.dowork += new DoWorkEventHandler(backgroundWorker1_DoWork); backgroundworker1.runworkercompleted += new RunWorkerCompletedEventHandler( backgroundworker1_runworkercompleted); backgroundworker1.progresschanged += new ProgressChangedEventHandler( backgroundworker1_progresschanged);

DoWork // This event handler is where the actual, // potentially time-consuming work is done. private void backgroundworker1_dowork(object sender, DoWorkEventArgs e) // Get the BackgroundWorker that raised this event. BackgroundWorker worker = sender as BackgroundWorker; // Assign the result of the computation // to the Result property of the DoWorkEventArgs // object. This is will be available to the // RunWorkerCompleted eventhandler. e.result = ComputeFibonacci((int)e.Argument, worker, e);

WorkCompleted // This event handler deals with the results of the background operation. private void backgroundworker1_runworkercompleted( object sender, RunWorkerCompletedEventArgs e) // First, handle the case where an exception was thrown. if (e.error!= null) MessageBox.Show(e.Error.Message); else if (e.cancelled) resultlabel.text = "Canceled"; else resultlabel.text = e.result.tostring();

ProgressChanged // This event handler updates the progress bar. private void backgroundworker1_progresschanged(object sender, ProgressChangedEventArgs e) this.progressbar1.value = e.progresspercentage; Long ComputeFibonacci( ) //... worker.reportprogress(percentcomplete); //

P / Invoke

WinApi rajapinnan kutsuminen.net ohjelmasta P/Invoke Platform invoke is a service that enables managed code to call unmanaged functions implemented in dynamic link libraries (DLLs), such as those in the Win32 API

P/Invoke

Esimerkki using System.Runtime.InteropServices; public class Win32 [DllImport("user32.dll", CharSet=CharSet.Auto)] public static extern int MessageBox(int hwnd, String text, String caption, uint type); public class HelloWorld public static void Main() Win32.MessageBox(0, "Hello World", "Platform Invoke Sample", 0);

Lähteet System.Threading http://msdn2.microsoft.com/enus/library/system.threading.aspx Threading (C# programming guide) http://msdn2.microsoft.com/en-us/library/ms173178.aspx P/Invoke http://msdn.microsoft.com/msdnmag/issues/03/07/net/ BackgroundWorker http://msdn2.microsoft.com/enus/library/system.componentmodel.backgroundworker.aspx

Lähteet Asynchronous Delegates http://msdn.microsoft.com/library/default.asp? url=/library/enus/cpguide/html/cpovrasynchronousdelegates.asp Control.Invoke http://msdn2.microsoft.com/enus/library/zyzhdc6b.aspx