Probleme mit Thread und QTcpSocket

Alles rund um die Programmierung mit Qt
Antworten
ReALITY5
Beiträge: 8
Registriert: 17. März 2007 21:23
Kontaktdaten:

Probleme mit Thread und QTcpSocket

Beitrag von ReALITY5 »

ich kann zu keinem Server connecten, wenn ich über einen 2. Thread mit QTcpSocket zu einem Server connecten will.

Mein Kdevelop spuckt folgendes in der Console aus:
QMetaObject::invokeMethod: Unable to handle unregistered datatype 'OpenMode'

Code: Alles auswählen

#include "qteamspeakthread.h"
#include <QMutexLocker>
#include <QTextStream>
#include<iostream>
#include<QMessageBox>
using namespace std;

QTeamspeakThread::QTeamspeakThread()
 : QThread()
{
    state = 0;
    quit = false;
}

void QTeamspeakThread::refresh()
{
    QMutexLocker locker(&mutex);
    if(!isRunning())
    {
        start();
    }
    else
    {
        cond.wakeOne();
    }
}

void QTeamspeakThread::connectToServer(const QString &ip,const QString &port,quint16 qport)
{
    QMutexLocker locker(&mutex);
    this->hostname = ip;
    this->port = port;
    this->qport = qport;
    state |= 1;
    if(!isRunning())
    {
        start();
    }
    else
    {
        cond.wakeOne();
    }
}

void QTeamspeakThread::sendRequest(const QString &request)
{
    QMutexLocker locker(&mutex);
    state |= 2;
    query = request;
    if(!isRunning())
    {
        start();
    }
    else
    {
        cond.wakeOne();
    }
}

void QTeamspeakThread::run()
{
    mutex.lock();
    QString ServerName = hostname;
    quint16 ServerPort = qport;
    mutex.unlock();
    while(!quit)
    {
        if(state == 1)
        {
            socket.connectToHost(ServerName,ServerPort);
            if(!socket.waitForConnected())
            {
                emit error(socket.error(),socket.errorString());
                return;
            }
            while(socket.bytesAvailable() < (int)sizeof(quint8))
            {
                if(!socket.waitForReadyRead())
                {
                    emit error(socket.error(),socket.errorString());
                    return;
                }
            }
            qDebug(socket.readLine());
            state |= 1;
        }
        QTextStream *t = new QTextStream(&socket);
        if(state & 2)
        {
            *t<<query<<"\r\n";
            t->flush();
            while(socket.bytesAvailable() < (int)sizeof(quint8))
            {
                if(!socket.waitForReadyRead())
                {
                    emit error(socket.error(),socket.errorString());
                    return;
                }
            }
            qDebug(socket.readLine());
            state |= 2;
        }
        cond.wait(&mutex);
        /* *t<<query<<"\r\n";
        t->flush();*/
    }
}

QTeamspeakThread::~QTeamspeakThread()
{
    quit = true;
    cond.wakeOne();
    wait();
}



Antworten