Fragen zu QThread und QMutex
Verfasst: 25. August 2009 16:17
Hallo,
ich habe eine Frage an euch. Eins vorab, ich benutze Visual Studio 2008 + QT 4.5. Ich möchte zwei Klassen von QThread ableiten. Einmal eine für meine GUI und einmal für meine UDP Kommunikation. Ich habe mir meine GUI mit dem QT-Designer zusammen geklickt. Ich denke das muss nicht kommentiert werden.
Jetzt zu meiner Kommunikationsklasse. Die sieht wie folgt aus.
Hier im Konstruktor erzeuge ich mir die ganzen Objekte die ich benötige.
Im Destruktor lösche ich die ganzen Objekte, um Memory Leaks zu verhindern.
In dieser Methode versende ich ein Paket (die Methode werde ich jetzt nicht zeigen), starte den Timer und möchte den Thread mit einer Mutex sperren, bis die Daten angekommen sind oder mein Timer runtergezählt hat.
Dieser Slot wird aufgerufen, wenn Timer runtergezählt hat. Damit möchte ich das warten auf eine Antwort unterbinden. Anschließend gib ich die Mutex wieder frei.
Wenn daten angekommen sind, öffnet sich dieser Slot und die Mutex wird wieder freigegeben.
Wenn ich die Mutex entferne klappt das alles. Aber ich möchte eine ganz andere Funktion erreichen. Ich möchte das beide Klassen zwei verschiede Threads sind, aber wenn ich diese noch zusetztlich von QThread ableite. Sagt mir der Kompiler, dass dieses nicht möglich ist, da QMainQindow und QObject bereits Basisklassen von QThread sind. Wie kann ich zwei Thread erzeugen?
Mein zweites Problem ist noch, das ich in der Methode "initialize" von der Kommunikationsklasse nicht auf die Mutex warten kann. Mir ist dabei wichtig, das diese einen Rückgabewert hat, jetzt in diesem Fall ein boolscher Wert, damit ich das erfolgreich oder nicht erfolgreich signalisieren kann. Deswegen möchte ich da warten, ob der Timer oder ein UDP Paket gekommen ist.
Würde mich sehr freuen, wenn ihr mir weiterhelfen könnt oder hoffe auf Anregungen. Vielleicht hat jemand soetwas schon implemetiert und kann mir eine bessere Lösung vorschlagen.
Danke
Gruss
Apollinaris
Ich benutze Visual Studio 2008 + QT 4.5 (open source)
ich habe eine Frage an euch. Eins vorab, ich benutze Visual Studio 2008 + QT 4.5. Ich möchte zwei Klassen von QThread ableiten. Einmal eine für meine GUI und einmal für meine UDP Kommunikation. Ich habe mir meine GUI mit dem QT-Designer zusammen geklickt. Ich denke das muss nicht kommentiert werden.
Code: Alles auswählen
#include "allneededheader"
class Gui : public QMainWindow
{
Q_OBJECT
public:
Gui(QWidget *parent = 0, Qt::WFlags flags = 0);
~Gui();
private slots:
void Initialize();
private:
Ui::GuiClass ui;
Com *myCom;
};
Gui::Gui(QWidget *parent, Qt::WFlags flags) : QMainWindow(parent, flags)
{
ui.setupUi(this);
Gui::connect( ui.btnInitialize, SIGNAL( clicked() ),this, SLOT( Gui::Initialize() ) );
}
void Gui::Initialize()
{
bool rc;
rc = myCom->initialize( 10 );
}
Code: Alles auswählen
class Com : public QObject
{
Q_OBJECT
public:
Com(QTextEdit *textEdit);
~Com();
bool initialize(unsigned char);
private slots:
void timeOut();
void UdpPackage();
private:
QUdpSocket *udpSocket;
QTimer *timer;
QMutex *mutex;
};
Code: Alles auswählen
Com::Com()
{
udpSocket = new QUdpSocket( this );
timer = new QTimer( this );
timer->setInterval( 5000 );
connect( timer, SIGNAL( timeout() ), this, SLOT( timeOut() ) );
connect( udpSocket, SIGNAL(readyRead() ), SLOT( getUdpPackage() ) );
// Öffne einen Port zum empfangen von Nachrichten
udpSocket->bind( QHostAddress::QHostAddress( "IP" ), Port);
}
Code: Alles auswählen
Com::~Com(void)
{
udpSocket->close();
delete udpSocket;
delete timer;
delete mutex;
}
Code: Alles auswählen
bool Com::initialize( unsigned char INITIALIZE )
{
sendUdp( INITIALIZE );
timer->start();
mutex->lock();
*
*
return rc;
}
Code: Alles auswählen
void Com::timeOut()
{
timer->stop();
*
*
//Mutex wieder freigeben
mutex->unlock();
}
Code: Alles auswählen
void Com::UdpPackage()
{
//Timer stoppen
if ( timer->isActive() )
timer->stop();
*
*
*
//Mutex wieder freigeben
mutex->unlock();
}
Mein zweites Problem ist noch, das ich in der Methode "initialize" von der Kommunikationsklasse nicht auf die Mutex warten kann. Mir ist dabei wichtig, das diese einen Rückgabewert hat, jetzt in diesem Fall ein boolscher Wert, damit ich das erfolgreich oder nicht erfolgreich signalisieren kann. Deswegen möchte ich da warten, ob der Timer oder ein UDP Paket gekommen ist.
Würde mich sehr freuen, wenn ihr mir weiterhelfen könnt oder hoffe auf Anregungen. Vielleicht hat jemand soetwas schon implemetiert und kann mir eine bessere Lösung vorschlagen.
Danke
Gruss
Apollinaris
Ich benutze Visual Studio 2008 + QT 4.5 (open source)