...
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
|
...