Graafisen käyttöliittymän ohjelmointi Syksy 2013

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

Graafisen käyttöliittymän ohjelmointi Syksy 2013

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

Graafisen käyttöliittymän ohjelmointi

Käyttöjärjestelmät: poissulkeminen ja synkronointi

Graafisen käyttöliittymän ohjelmointi Syksy 2013

Rinnakkaisuus (.NET) Juha Järvensivu 2007

Tapahtumapohjainen ohjelmointi

Graafisen käyttöliittymän ohjelmointi

C++11 lambdat: [](){} Matti Rintala

Tapahtumapohjainen ohjelmointi. Juha Järvensivu 2007

Graafisen käyttöliittymän ohjelmointi Syksy 2013

Operaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta

Ohjelmoinnin peruskurssien laaja oppimäärä

Liite 1. Projektin tulokset (Semaforit Javassa) Jukka Hyvärinen Aleksanteri Aaltonen

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

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

Olio-ohjelmointi Syntaksikokoelma

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

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

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. X Poikkeusten käsittelystä

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

Ohjelmoinnin peruskurssien laaja oppimäärä

T Olio-ohjelmointi Osa 3: Luokka, muodostin ja hajotin, this-osoitin Jukka Jauhiainen OAMK Tekniikan yksikkö 2010

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

1. Omat operaatiot 1.1

1. Mitä tehdään ensiksi?

10 Lock Lock-lause

Ohjelmoinnin jatkokurssi, kurssikoe

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

812315A Ohjelmiston rakentaminen. Asynkronisuus

812341A Olio-ohjelmointi Peruskäsitteet jatkoa

Ohjelmistojen mallintaminen, sekvenssikaaviot

Ohjelmistojen mallintaminen Olioiden yhteistyö Harri Laine 1

ITKP102 Ohjelmointi 1 (6 op)

Solidity älysopimus ohjelmointi. Sopimus suuntautunut ohjelmointi

815338A Ohjelmointikielten periaatteet

19/20: Ikkuna olio-ohjelmoinnin maailmaan

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

Ohjelmointikieli TIE Principles of Programming Languages Syksy 2017 Ryhmä 19

Tiedostonkäsittely ja asetusten tallentaminen. Graafisen käyttöliittymän ohjelmointi Luento 14

Rinnakkaisuus. parallel tietokoneissa rinnakkaisia laskentayksiköitä concurrent asioita tapahtuu yhtaikaa. TTY Ohjelmistotekniikka

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

Olio-ohjelmointi Javalla

RINNAKKAINEN OHJELMOINTI A,

QT model view. Juha Järvensivu 2008

9. Periytyminen Javassa 9.1

15. Ohjelmoinnin tekniikkaa 15.1

Sisällys. Metodien kuormittaminen. Luokkametodit ja -attribuutit. Rakentajat. Metodien ja muun luokan sisällön järjestäminen. 6.2

Harjoitustyö: virtuaalikone

Tapahtumapohjainen ohjelmointi. Juha Järvensivu 2008

Mikä yhteyssuhde on?

Projekti 1 Säikeet ja kriittisen vaiheen kontrollointi javalla

Javan perusteita. Janne Käki

T Henkilökohtainen harjoitus: FASTAXON

Taulukot. Jukka Harju, Jukka Juslin

Rinnakkaisohjelmointi kurssi. Opintopiiri työskentelyn raportti

Rinnakkaisuus. Juha Järvensivu 2008

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

4. Luento: Prosessit ja säikeets. Tommi Mikkonen,

OSA I: Yhteisten muuttujien käyttö Prosessit samassa koneessa. Sisältöä. Poissulkeminen. Halutut ominaisuudet 2-1. Rinnakkaiset, atomiset operaatiot

2. Olio-ohjelmoinista lyhyesti 2.1

Ohjelmoinnin perusteet Y Python

Asynkroninen ohjelmointi.net 4.5 versiolla

Delegaatit ja tapahtumakäsittelijät

Prosessi perinteisesti

Stallings, Luku 4.1. KJ-I I S2005 / Tiina Niklander, kalvot Auvo HäkkinenH

QT framework. Juha Järvensivu 2007

Luokassa määriteltävät jäsenet ovat pääasiassa tietojäseniä tai aliohjelmajäseniä. Luokan määrittelyyn liittyvät varatut sanat:

812341A Olio-ohjelmointi, IX Olioiden välisistä yhteyksistä

C++11 Syntaksi. Jari-Pekka Voutilainen Jari-Pekka Voutilainen: C++11 Syntaksi

Metodien tekeminen Javalla

Kiertokysely. Sulautetut järjestelmät Luku 2 Sivu 1 (??)

Jaetun muistin muuntaminen viestin välitykseksi. 15. lokakuuta 2007

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

Rajapinta (interface)

4. Olio-ohjelmoinista lyhyesti 4.1

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

Osa III. Olioiden luominen vapaalle muistialueelle

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

Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti:

ITKP102 Ohjelmointi 1 (6 op)

on ohjelmoijan itse tekemä tietotyyppi, joka kuvaa käsitettä

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

Graafisen käyttöliittymän ohjelmointi Syksy 2013

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

7. Oliot ja viitteet 7.1

812347A Olio-ohjelmointi, X Reflektiivisyys

ITKP102 Ohjelmointi 1 (6 op)

OSA I: Yhteisten muuttujien käyttö. Prosessit samassa koneessa. Rio 2004 / Auvo Häkkinen 2-1

OSA I: Yhteisten muuttujien käyttö. Sisältöä. Prosessit samassa koneessa. Poissulkeminen ja synkronointi. Semaforit ja rinnakkaisuuden hallinta

QT tyylit. Juha Järvensivu 2008

Qt-käyttöliittymäkirjasto

OHJ-7400 Graafisen käyttöliittymän ohjelmointi 4/6op

Luokat ja oliot. Ville Sundberg

815338A Ohjelmointikielten periaatteet

TIE Ohjelmistojen suunnittelu. Luento 8..9: moniperintä

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

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

Rajapinnat ja olioiden välittäminen

Transkriptio:

TIE-11300 Tietotekniikan vaihtuva-alainen kurssi Graafisen käyttöliittymän ohjelmointi Syksy 2013 Luento 10 Rinnakkaisuus käyttöliittymäohjelmoinnissa Juha-Matti Vanhatupa

Rinnakkaisuus ja käyttöliittymäohjelmointi Käyttöliittymäohjelmoinnissa rinnakkaisuudella estetään käyttöliittymän jumiutuminen -> reagoi aina käyttäjän toimenpiteisiin Käyttöliittymän tulee antaa palautetta käyttäjän pitkäkestoisten toimenpiteiden sujumisesta (esim. progress bar, odotusanimaatiot) Käyttäjän tulee myös voida peruuttaa tekemänsä toimenpiteet

Prosessi vs Säie Prosessi Muistin suojauksen yksikkö Säie Suorituksen yksikkö

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

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

Rinnakkaisuus QT:ssa Tarjoaa käyttöjärjestelmäriippumattoman tavan rinnakkaiseen ohjelmointiin QThread QMutex QRunnable QThreadPool QAtomicInt GUI thread (main thread) QCoreApplication::exec()

Säikeen luominen class MyThread : public QThread { Q_OBJECT protected: void run(); }; void MyThread::run() { }

Säikeen käynnistäminen MyThead* pthread = new MyThread(); pthread->start(qthread::normalpriority); http://qt-project.org/doc/qt- 5.1/qtcore/qthread.html#Priority-enum

Säikeen käynnistäminen QApplication (tai QCoreApplication jos kyseessä komentorivisovellus) olio luotava ennen säikeiden luontia.

Säikeen elinkaari ja signaalit Luonti start() -> suoritus alkaa (started() -signaali) Suoritus kutsuu run() funktiota Suoritus loppuu kun run() :sta palataan. (finishedsignaali) Suoritus voidaan myös lopettaa väkisin kutsumalla terminate() (terminated()-signaali)

Säikeen sanomajono Säikeelle voi luoda oman sanomajonon exec(); // QThread Tarpeellinen, jos halutaan käyttää timereita Lähettää signaaleja toisesta threadista Lähettää eventtejä Tuhota objekteja deletelater-kutsulla Huom! Widgettien käsittely mahdollista vain GUIthreadista!

Säikeen sanomajono Event jono OK Säie1 obj1 Emit signal Säie2 obj2 Emit signal Virhe!

Säikeiden välinen kommunikointi Jaetun muuttujan avulla Signaalien avulla

QObject Objektit elävät threadissa QObject::thread(); Objektin omistavaa säiettä voi vaihtaa QObject::moveToThread(); Myös kaikki lapsi-objektit siirtyvät Siirrettävällä objektilla ei saa olla parenttia Objektiin asennetun event filterin tulee myös olla samassa säikeessä kuin tarkailtava objekti.

QObject Luominen Objektin luontivaiheessa myös mahdollinen parent-objekti pitää olla samassa säikeessä Tuhoaminen Objektin tuhoaminen toisesta threadistä ei ole sallittua QObject:: deletelater(); skeduloi objektin tuhottavaksi. Objekti tuhotaan kun suoritus palaa event-loop:iin.

QObject Jäsenfunktioiden kutsuminen QObject ei ole automaattisesti säieturvallinen, vaan pitää käyttää mutexeja Poikkeuksena signaalien kytkeminen

Reentrant Luokka on reentrant jos sen jokaista jäsenfunktiota voidaan kutsua yhtäaikaa eri säikeistä eri olioille. (ei jaettua dataa) class Counter { public: Counter() { n = 0; } void increment() { ++n; } void decrement() { --n; } int value() const { return n; } private: int n; };

Thread safe Luokka on säieturvallinen, jos sen olion jäsenfunktioita voidaan kutsua yhtä aikaa eri säikeistä. class Counter { public: Counter() { n = 0; } void increment() {QMutexLocker locker(&mutex); ++n; } void decrement() {QMutexLocker locker(&mutex); --n; } int value() const {QMutexLocker locker(&mutex); return n; } private: mutable QMutex mutex; int n; };

Reentrant ja thread safe Reentrant thread safe a() b() c() Oliot a() b() c() a() b() c() Olio a() b() c() a() b() c() a() b() c() Säikeet Säikeet

QMutex Metodeja void lock() bool trylock() void unlock() Lukko pitää avata samasta säikeestä missä se lukittiin.

QMutexLocker Lukitsee mutexin koko funktiokutsun ajaksi

Säikeen sanomajono Objekti voi lähettää signaalin vaikka säikeellä ei ole sanomajonoa Säikeessä elävä objekti ei voi vastaanottaa signaaleja tai eventtejä toisesta säikeestä, jos säikeellä ei ole sanomajonoa Signaalien kytkeminen on säieturvallista

Signaalien kytkeminen Tapahtuu oletuksena eri tavalla riippuen siitä ovatko lähettäjä ja vastaanottaja samassa vai eri säikeessä Sama säie: signaalin emitointi vastaa funktiokutsua Eri säie: signaali menee säikeen sanomajonon kautta

Signaalien kytkeminen Kytkennän tyyppi määritellään antamalla tyyppi connect funktion parametrina. connect(theard1, SIGNAL(finished()), this, SLOT(OnThreadhQuit()),Qt::QueuedConnection);

Signaalien kytkeminen enum Qt::ConnectionType Qt::DirectConnection Toimitetaan välittömästi slot:iin. Slot suoritetaan signaalin lähettäneessä säikeessä. Qt::QueuedConnection Signaali on jonossa kunnes säikeen sanomajono toimittaa sen slot:lle. Slot suoritetaan vastaanottavassa säikeessä. Qt::BlockingQueuedConnection Sama kuin QueuedConnection, mutta säikeen suoritus pysäytetään kunnes signaali on toimitettu. Tulee käyttää vain kun vastaanottaja on toisessa säikeessä. Väärinkäyttö voi johtaa ohjelman jumiutumiseen.

Signaalien kytkeminen Qt::AutoConnection (default) Sama kuin DirectConnection, jos lähettäjä ja vastaanottaja ovat samassa säikeessä. Sama kuin QueuedConnection, jos lähettäjä ja vastaanottaja ovat eri säikeissä. Qt::UniqueConnection Sama kuin AutoConnection, mutta tarkistaa että signaalin ja slot:n välille ei ole jo luotu yhteyttä. Qt 4.6 alkaen.

QThreadPool Hallinnoi säie-joukkoa. Vähentää säikeiden luomiskustannuksia kierrättämällä säie-olioita. Jokaisella Qt-sovelluksella globaali QThreadPool-instanssi, voidaan pyytää kutsumalla QThreadPool::globalInstance() Oletuksena tuhoaa hallinnoimansa QRunnable-oliot.

Qt: Käyttöliittymän jumiutumisen estäminen Käytetään useaa säiettä Pitkäkestoisen operaation aikana kutsutaan tiuhaan processevents() funktiota. Jotta muut eventit tulee käsiteltyä Käytetään 0 ms:n timeria, joka laukeaa aina kun muita eventtejä ei ole. Aina kun timer laukeaa suoritetaan varsinaista tehtävää.

QtConcurrent Tarjoaa korkeamman tason rajapinnan rinnakkaisuuden toteuttamiseen Rajapintaa käyttävät ohjelmat skaalautuvat automaattisesti tulevaisuuden mahdollisesti isommille prosessorimäärille Julkaistu Qt 4.4 versiossa Osa QtCore moduulia

QtConcurrent QImage scaled(const QImage& image) { return image.scaled(qsize(100,100)); } Const QList<QImage>images = const Qlist<Qimage> thumbnails = QtConcurrent::mapped(images, scaled); Esimerkkikoodi ajaa scaled operaation jokaiselle kuvalle käyttäen yhtä montaa säiettä kuin laitteessa on prosessoreja.