Threads in QT

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
Darwin
Beiträge: 12
Registriert: 1. Juni 2009 12:56

Threads in QT

Beitrag von Darwin »

Hallo Forum,

ich bin ein blutiger Anfänger in C++ und habe fast keine Erfahrung in
QT.

Im Moment arbeite ich an einem Projekt, welches Daten über die Serielle
Schnittstelle sendet und wieder einliest - das geht bereits. Weiteres
sollen die Daten auch auf der Gui ausgegeben werden - was über manuelle
betätigung über Buttons auch Funktioniert.
Mein Ziel ist es, das senden und empfangen in einer Schleife ausführen
zu lassen.

Hierfür habe ich im Programm wo SetupUi aufgerufen wird einen Thread
erzeugt, welcher auch ausgeführt (zZ. while(1) Schleife in der
run()-Methode) wird. In diesem soll dann das Senden/Empfangen
stattfinden.

Code: Alles auswählen

Miniterminal::Miniterminal(QMainWindow *parent) : QMainWindow(parent){

  setupUi(this);
  connect(buttonConnect, SIGNAL(clicked()), this, SLOT(Verbinden()));
  connect(buttonSend, SIGNAL(clicked()), this, SLOT(Senden()));
  a.start(); // Thread
}
Mein eigentliches Problem ist, wie ich die empfangenen Daten vom Thread
a in das UI bekomme.

Bis jetzt habe ich folgendes Probiert:
Ich habe im Thread die "ui_Miniterminal.h" eingebunden (vom qmake
erzeugte GUI Header) und lineSenden->setText("Test"); (lineSenden ist
der Objektname von meinem LineEdit) aufgerufen, was er mir mit der
Fehlermeldung 'lineSenden undecleared' aber leider verweigert.

Wie kann ich dieses Problem am einfachsten lösen?
Was wäre der sauberste Weg?

Danke im vorraus,
Mike

Entwicklung unter Windows XP, QT 4.5.1/MinGW
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Das Ui allein einbinden bringt auch nix, das definiert ja nur 2 Methoden (setupUi, retranslateUi), so hast du ja noch gar keinen Zugriff auf das taatsächliche Widget-Objekt!
Solltest du das schaffen, stehst du vor einem weiteren Problem: Du kannst in deinem Thread keine Zugriffe auf Ui-Elemente durchführen! Sowas geht in Qt nur im Hauptthread.
Die einzige Möglichkeit ist, das über SIGNAL/SLOT von Thread nach Miniterminal zu machen.
Lies dir auch mal das Kapitel "Thread SUpport in Qt" im Assistant durch. Steht alles ausführlich drin.

Zu guter letzt: Hoffentlich verwendest du für den Zugriff auf die serielle Schnittstelle qextserialport...

Grüße
Franz
Darwin
Beiträge: 12
Registriert: 1. Juni 2009 12:56

Beitrag von Darwin »

Servus Franz,

vielen Dank für Deine bisherige Hilfe. Das Signal-Slot Konzept gefällt mir sehr gut, ich habe aber Probleme im implementieren. Eventuell hast Du ja etwas Geduld mit mir und kannst mir einen Hinweis geben.
Ich poste hier einfach mal den fehlerhaften Code:

Miniterminal-Code:

Code: Alles auswählen

Miniterminal::Miniterminal(QMainWindow *parent) : MainWindow(parent)
{
	setupUi(this);
  	a.start();
	connect(&a,SIGNAL(valueChanged()),this, SLOT(setValue()));
}

void Miniterminal::setValue()
{
	lineSenden -> setText("Threading");
}
Miniterminal-Header:

Code: Alles auswählen

#include "SerThread.h"
class Miniterminal : public QMainWindow, public Ui::MainWindow{
	Q_OBJECT

	SerThread a;
 
	public:
		Miniterminal (QMainWindow *parent = 0);
		~Miniterminal();
	public slots:
		void setValue(); 
};
Thread-Header:

Code: Alles auswählen

#include <qthread.h>
class SerThread:public QThread
{
public:
  SerThread();
public:
  virtual void run();
signals:
  void valueChanged();
};
Thread-Code:

Code: Alles auswählen

#include"SerThread.h"
SerThread::SerThread() 
{
}

void SerThread::run()
{
	while(1)
	{
		emit valueChanged();
	}
}
Der Kompiler bringt mir dabei folgende Fehlermeldung:

undefined reference to SerThread::valueChanged();

Danke im voraus,
Michael
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

QThread == QObject -> da gehört auch ein "Q_OBJECT" in die Header-Datei, wie bei Miniterminal.h.
Danach noch "make clean" und "qmake", damit der moc auch brav seine Files schreibt :)
Darwin
Beiträge: 12
Registriert: 1. Juni 2009 12:56

Beitrag von Darwin »

So, jetzt hats geklappt. Also das mit dem Q_OBJECT muss ich mir merken.

Vielen Dank für Deine Hilfe, finde ich echt Spitze von Dir.

Lg,
Mike
Antworten