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

Tee alla oleva esimerkki seuraavasti:

  1. Tee uusi Dialog perustainen projekti
  2. Tee luokka Saie tai Thread periyttämällä se QThread luokasta ja type information arvoksi QObject
  3. Tee dialogiin napit, jolla käynnistät ja pysäytät säikeen sekä tekstiruudun ja napin tiedon välittämiseksi säikeelle.
  4. Tee tekstiruutu, johon voi kirjoittaa säikeen laskurin arvoa.
  5. Tee dialogiin SLOT VastaanotaArvoSaikeelta(int)
  6. Tee saikeeseen SLOT jolla vastaanotat asetusarvon käyttöliittymästä.
  7.  

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

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_pushButtonSiirraTietoaTyosaikeelle_clicked()
{
    QString apu=ui->lineEdit_2>tietosaikeelle->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);
}

...