Meine WinCE Anwendung soll zu einer Hostanwendung eine Socket Verbindung aufbauen. Meine Anwendung soll als Client fungieren.
Nun kann es aber sein, dass die Hostanwendung später gestartet wird als meine Clientanwendung.
Deshalb habe ich versucht einer Art Pollen (im seperaten Thread) zu implementieren. Da ich gerade mit dem Signal/Slot Prinzip noch nicht so vertraut bin, stoße ich schnell auf Probleme.
Das habe ich bis jetzt gemacht:
Code: Alles auswählen
class QSocketEngine : public QThread
{
Q_OBJECT
private:
QAbstractSocket *m_pTcpSocket;
private slots:
void SocketStateChanged(QAbstractSocket::SocketState socketState);
void displayError( QAbstractSocket::SocketError socketError);
void ReadFromSocket();
protected:
void run();
public:
explicit QSocketEngine(QObject *parent = 0);
};
Code: Alles auswählen
QSocketEngine::QSocketEngine(QObject *parent) :
QThread(parent)
{
// neuen Tcp-Socket erstellen
m_pTcpSocket = new QTcpSocket();
//--- Objekt in diesen Thread 'verschieben'
m_pTcpSocket->moveToThread(this);
connect(m_pTcpSocket, SIGNAL(readyRead()),
this, SLOT(ReadFromSocket() ) );
connect(m_pTcpSocket, SIGNAL(error( QAbstractSocket::SocketError)),
this, SLOT(displayError(QAbstractSocket::SocketError) ), Qt::DirectConnection);
connect(m_pTcpSocket, SIGNAL(stateChanged(QAbstractSocket::SocketState)),
this, SLOT(SocketStateChanged(QAbstractSocket::SocketState)), Qt::DirectConnection);
}
void QSocketEngine::run()
{
static int nConnect = 0;
qDebug() << "Thread begin";
do
{
qDebug() << "PollForServer - Try Nr" << nConnect;
nConnect++;
blockSize = 0;
// Falls in Verwendung, Socket zurücksetzen
m_pTcpSocket->abort();
// Mit dem Server verbinden
m_pTcpSocket->connectToHost("192.168.1.1", 4000);
}
while(!m_pTcpSocket->waitForConnected());
qDebug() << "Thread end";
}
void QSocketEngine::SocketStateChanged(QAbstractSocket::SocketState socketState)
{
...
...Wenn ich nun die Hostanwendung starte, sehe ich dass die Verbindung erfolgreich etabliert wurde:PollForServer - Try Nr 1
SocketStateChanged (Thread) QAbstractSocket::HostLookupState
SocketStateChanged (Thread) QAbstractSocket::ConnectingState
SocketStateChanged (Thread) QAbstractSocket::UnconnectedState
SocketError (Thread) QAbstractSocket::ConnectionRefusedError
PollForServer - Try Nr 2
SocketStateChanged (Thread) QAbstractSocket::HostLookupState
...
...
Nur kann ich aber keine Daten empfangen, da sich der Thread beendet und der Slot readyRead() nicht mehr funktioniert.SocketStateChanged (Thread) QAbstractSocket::ConnectedState
Thread end
Der Thread 0x7f40096 hat mit Code 0 (0x0) geendet.
Wie kann ich das Problem lösen?
Es soll im zweiten Schritt auch so sein, dass wenn die Hostanwendung geschlossen wird, das Pollen wieder gestartet wird, damit bei einem erneuten Starten wieder eine Verbindung etabliert werden kann.
Vielen Dank