TcpSocket`s "ReadyRead" als Thread
Verfasst: 18. Mai 2010 13:08
Hallo Leute!
Seit mehreren Wochen schon zerbreche ich mir den Kopf darüber und bekomms nicht wirklich hin...
Folgendes Problem:
Der Client meldet sich am Server an und bekommt 3 Pakete hintereinander zugesendet...
Wenn der Client nun das erste Paket abarbeitet darf`s nicht zu lange dauern weil sonst der Thread blockiert und ReadyRead nicht wieder "anschlagen" kann. Manchmal hatte ich auch sogar Problem das die Pakete ineinander verschachtelt ankamen.
Deswegen will ich eigentlich das mein ReadyRead nur prüft ob ein Paket reinkommt, kurz puffert und dann ein Signal gibt, so das mein MainWindow das Paket abarbeiten kann. Aber selbst das haut nicht wirklich hin, weil dann mein drittes Paket leider verloren geht sobald ich 10ms pausiere (zur Simulation dienend).
Im MainWindow erstellt:
ClientTcpSocket-Klasse
Bin für jeden Tipp dankbar
Vielen Dank schonmal im vorraus.
Gruß
Mineralwater
Seit mehreren Wochen schon zerbreche ich mir den Kopf darüber und bekomms nicht wirklich hin...
Folgendes Problem:
Der Client meldet sich am Server an und bekommt 3 Pakete hintereinander zugesendet...
Wenn der Client nun das erste Paket abarbeitet darf`s nicht zu lange dauern weil sonst der Thread blockiert und ReadyRead nicht wieder "anschlagen" kann. Manchmal hatte ich auch sogar Problem das die Pakete ineinander verschachtelt ankamen.
Deswegen will ich eigentlich das mein ReadyRead nur prüft ob ein Paket reinkommt, kurz puffert und dann ein Signal gibt, so das mein MainWindow das Paket abarbeiten kann. Aber selbst das haut nicht wirklich hin, weil dann mein drittes Paket leider verloren geht sobald ich 10ms pausiere (zur Simulation dienend).
Im MainWindow erstellt:
Code: Alles auswählen
tcpSocket = new ClientTcpSocket(settings);
connect(tcpSocket, SIGNAL(bufferReady(QByteArray)), this, SLOT (getBuffer(QByteArray)));
tcpSocket->loginOnServer();
void MainWindow::getBuffer(QByteArray buffer){
qDebug() << "Das Paket wird abgearbeitet... (simulierte 10ms)";
SleeperThread::msleep(10);
}
ClientTcpSocket-Klasse
Code: Alles auswählen
ClientTcpSocket::ClientTcpSocket(ClientSettings *settings, QObject *parent) : QThread(parent)
{
m_settings = settings;
m_socket = new QTcpSocket;
}
void ClientTcpSocket::run()
{
connect(m_socket, SIGNAL(readyRead()), this, SLOT(readClientData()));
exec();
}
void ClientTcpSocket::readClientData()
{
qDebug() << "ClientTcpSocket... Bekomme Daten rein...";
QDataStream in(m_socket);
in.setVersion(QDataStream::Qt_4_6);
in >> m_buffer;
emit bufferReady(m_buffer);
}
void ClientTcpSocket::loginOnServer()
{
if(!m_socket->isOpen())
{
m_socket->connectToHost("...","...");
if(m_socket->waitForConnected(2000))
{
start(); // QThread anlaufen lassen...
m_socket->write("loginDaten"); // Daten an Server senden
}
else{
qDebug() << "Fehler, keine Verbindung hergestellt";
}
}
}
Vielen Dank schonmal im vorraus.
Gruß
Mineralwater