...
Code Block |
---|
#include "dialogi.h" #include "ui_dialogi.h" #include <QMessageBox> Dialogi::Dialogi(QWidget *parent) : QDialog(parent), ui(new Ui::Dialogi) { ui->setupUi(this); //yhdistetaan signaalit ja slotit connect(this,SIGNAL(AsetaTestiarvo(int)),&saie,SLOT(AsetaTestiarvo(int))); connect(&saie,SIGNAL(PaivitaUi(int)),this,SLOT(VastaanotaArvoSaikeelta(int))); } Dialogi::~Dialogi() { //sammutetaan säie, jottei tule segmentation faultia if(saie.isRunning())//onko asynkrooninen säie käynnissä { saie.pysayta();//pysäytetään säie } delete ui; } void Dialogi::changeEvent(QEvent *e) { QDialog::changeEvent(e); switch (e->type()) { case QEvent::LanguageChange: ui->retranslateUi(this); break; default: break; } } //haetaan arvo ruudulta void Dialogi::on_pushButton_clicked() { QString apu=ui->lineEdit_2->text(); int apu2=apu.toInt(); emit AsetaTestiarvo(apu2); } void Dialogi::on_StartSaie_clicked() { QMessageBox msgBox; if(saie.isRunning())//onko asynkrooninen säie käynnissä { msgBox.setText("Säie on jo käynnissä"); msgBox.exec(); } else { saie.start();//käynnistetään säie } } void Dialogi::on_StopSaie_clicked() { if(saie.isRunning())//onko asynkrooninen säie käynnissä { saie.pysayta();//pysäytetään säie } } void Dialogi::VastaanotaArvoSaikeelta(int arvo) { QString apu; apu.setNum(arvo); ui->lineEdit->setText(apu); } |
Ja alla käyttöliittymän otsikkotiedosto.
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) { 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; } |
...