Versions Compared

Key

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

...

Code Block
#ifndef DIALOGI_H
#define DIALOGI_H

#include <QDialog>
#include "saie.h"

namespace Ui {
    class Dialogi;
}

class Dialogi : public QDialog {
    Q_OBJECT
public:
    Dialogi(QWidget *parent = 0);
    ~Dialogi();
    Saie saie;
    //bool started;
protected:
    void changeEvent(QEvent *e);

private:
    Ui::Dialogi *ui;

private slots:
    void on_StopSaie_clicked();
    void on_StartSaie_clicked();
    void on_pushButton_clicked();
    void VastaanotaArvoSaikeelta(int);
signals:
    void AsetaTestiarvo(int);
};

#endif // DIALOGI_H


Säikeistetyn ohjelman toteutus vaatii QThread luokasta periytetyn luokan. Tähän luokkaan täytyy tehdä jäsenfunktiona run-funktio, jonka abstrakti toteutus on QThread luokassa. run-funktio muodostaa oman säikeen (thread), jota "ajetaan" samanaikaisesti käyttöliittymäsäikeen kanssa. run--funktio emitoi signaalien välityksellä käyttöliittymälle infoa reaalimaailman tapahtumista.

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)//talla maarataan saikeen paivitysvali
        {
            runTimer.restart();
            Testiarvo++;
            Testiarvo=Testiarvo+3;
            if(uiTimer.elapsed()>ui_paivitysaika)//talla maarataan kayttoliittyman paivitysvali
            {
                uiTimer.restart();
                emit  PaivitaUi(Testiarvo);
                msg.setNum(Testiarvo);
                qDebug()<< msg;//debug tuottaa informaatiota application output ikkunaan
            }
        }
        if(SaieStop==true){break;}
    }
    SaieStop=false;
}
Code Block
 #ifndef SAIE_H
#define SAIE_H

#include <QThread>
#include <QTime>
#include <QMutex>

class Saie : public QThread
{
Q_OBJECT
public:
    explicit Saie(QObject *parent = 0);
    int Testiarvo;
    bool SaieStop;
     QTime runTimer;
     QTime uiTimer;
     int jaksoaika;
     int ui_paivitysaika;
     void pysayta();
     QMutex mutex;
protected:
    //! run function for own real-time thread
    void run();
signals:
    void PaivitaUi(int);

public slots:
    void AsetaTestiarvo(int arvo);

};

#endif // SAIE_H

...