Jetzt funktioniert es schonmal seh gut. Ich kann mit dem Button "Programm starten..." den Thread und dessen Timer starten und mit dem Button "Programm beenden..." selbige wieder beenden bzw. stoppen.
Allerdings bekomme ich in der Debug-Konsole dabei folgende Meldungen:
1. beim Starten -> "QObject: Cannot create children for a parent that is in a different thread. (Parent is Thread(0x22fde4), parent's thread is QThread(0x3e4748), current thread is Thread(0x22fde4)"
2. beim Beenden -> "QObject::killTimer: timers cannot be stopped from another thread"
Warum ist das so und wie kann ich das verbessern?
Dann habe ich noch in der Klasse die Methode "closeEvent(QCloseEvent *event)" reimplementiert (so heißt das glaube ich). Damit wollte ich eigentlich verhindern, dass das Programm geschlossen wird, wenn der Thread noch läuft. Jedoch wird diese Methode nicht aufgerufen, wenn ich das Programm schließe. Was läuft hier falsch?
Würde mich über eure Hilfe sehr freuen!
Beste Grüße,
der Luftballon
Mousometer.cpp:
Code: Alles auswählen
#include "Mousometer.h"
Mousometer::Mousometer(QWidget *parent) : QMainWindow(parent) {
w = new QWidget;
layout = new QGridLayout(w);
spin = new QSpinBox;
slider = new QSlider(Qt::Horizontal);
label = new QLabel("Anzahl der Durchläufe");
button1 = new QPushButton("Programm starten...");
button2 = new QPushButton("Programm stoppen...");
edit = new QTextEdit;
edit->setFixedWidth(500);
edit->setFixedHeight(300);
spin->setMinimum(1);
spin->setMaximum(100);
slider->setMinimum(1);
slider->setMaximum(100);
layout->addWidget(label, 0, 0);
layout->addWidget(slider, 0, 1);
layout->addWidget(spin, 0, 2);
layout->addWidget(button1, 1, 1);
layout->addWidget(button2, 2, 1);
layout->addWidget(edit, 3, 0, 1, 3);
QObject::connect( spin, SIGNAL( valueChanged(int) ), slider, SLOT( setValue(int) ) );
QObject::connect( slider, SIGNAL( valueChanged(int) ), spin, SLOT( setValue(int) ) );
QObject::connect( button1, SIGNAL( clicked() ), this, SLOT( letMouseRun() ) );
QObject::connect( button2, SIGNAL( clicked() ), this, SLOT( stopMouse() ) );
QObject::connect( &thread, SIGNAL( finished() ), this, SLOT( threadReady() ) );
QMenu *fileMenu = new QMenu(tr("&Datei"), this);
menuBar()->addMenu(fileMenu);
fileMenu->addAction(
QIcon("./images/cancel.png"),
tr("Beenden..."), qApp, SLOT(quit()),
QKeySequence(tr("Ctrl+X", "Datei|Beenden")));
resize(320, 200);
setCentralWidget(w);
setWindowTitle("Mousometer");
}
Mousometer::~Mousometer() {}
void Mousometer::letMouseRun() {
if( thread.isRunning() ) {
edit->moveCursor(QTextCursor::End) ;
edit->insertPlainText(tr("QThread laeuft bereits\n"));
return;
}
slider->setValue(55);
thread.start();
edit->moveCursor(QTextCursor::End) ;
edit->insertPlainText(tr("QThread gestartet\n"));
}
void Mousometer::stopMouse() {
slider->setValue(66);
thread.timerStop();
}
void Mousometer::threadReady() {
edit->moveCursor(QTextCursor::End) ;
edit->insertPlainText(tr("QThread ist fertig\n"));
}
void Mousometer::closeEvent(QCloseEvent *event) {
qDebug() << "xxxxxxxxxxxxxxxx";
if( thread.isRunning() ) {
edit->moveCursor(QTextCursor::End) ;
edit->insertPlainText(tr("QThread laeuft noch\n"));
return;
}
//thread.wait();
}
Thread.cpp
Code: Alles auswählen
#include "Thread.h"
#include <QtGui>
Thread::Thread() {}
void Thread::run() {
timer = new QTimer(this);
QObject::connect( timer, SIGNAL(timeout()), this, SLOT(timerAction()) );
timer->start(500); // alle 500 ms ein Methodenaufruf
exec();
}
void Thread::timerAction() {
qDebug() << "i am alive!";
QTime t = QTime::currentTime();
QFile file("test.txt");
file.open(QIODevice::Append | QIODevice::Text);
file.write( QString("Sekunde = %1\n").arg(t.second()).toUtf8() );
file.close();
}
void Thread::timerStop() {
timer->stop();
quit();
}