Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Esimerkki työsäikeen käytöstä sekä funktion lukitsemisesta atomiseksi. Käyttöliittymää on järkevää päivittää n. 30...500 ms:n välein, kun taas ohjattavaa prosessia joudutaan tapauksesta riippuen mittaamaan ja ohjaamaan tarvittaessa paljon useammin. Mekatronisilla laitteilla päivitysväli on tyypillisesti 1...20 ms. Käyttöliittymän päivittäminen saattaa joissain tapauksissa olla hyvinkin raskasta, jos päivitettävänä on paljon grafiikkaa. Tyypillisesti käyttöliittymään päivitetään tapahtumaperustaisesti, kun taas prosessia ohjataan kelloon perustuen. Jos prosessin ohjaus sisältää säätimiä esimerkiksi aikaan perustuvia integraattoreita, niin vakio jaksoaikaan perustuva ohjaus on monesti helpointa toteuttaahelpoin ratkaisu.

Seuraavassa on esitetty käyttöliittymän yksinkertaisen toteutuksen lähdekoodi.

...

Code Block
#include "saie.h"
#include <QDebug>


Saie::Saie(QObject *parent) :
    QThread(parent)
{
    Testiarvo=0;
    runTimer.start();
    uiTimer.start();
    SaieStop=false;
    jaksoaika=1;
    ui_paivitysaika=10;
}

// tällä saadaan saie pysaytettya
void Saie::pysayta()
{
    SaieStop=true;
}

void Saie::AsetaTestiarvo(int arvo)
{
    //suojataan mutexilla sijoitus atomiseksi operaatioksi eli jos funktiossa on useimpia 
    //rivejä suoritattavaa ohjelmaa ne kaikki toteutetaan ilman, että
    //toinen säie pääsisi väliin
    QMutexLocker locer(&mutex);
    Testiarvo=arvo;
}

void Saie::run()
{
    //tässä syntyy toinen säie
    int arvo;
    QString msg;
    forever
    {
        if (runTimer.elapsed() > jaksoaika)
        {
            runTimer.restart();
            Testiarvo++;
            Testiarvo=Testiarvo+3;
            if(uiTimer.elapsed()>ui_paivitysaika)
            {
                uiTimer.restart();
                emit  PaivitaUi(Testiarvo);
                msg.setNum(Testiarvo);
                qDebug()<< msg;//debug informaatiota appöication output ikkunaan
            }
        }
        if(SaieStop==true){break;}
    }
    SaieStop=false;
}

...