QUdpSocket und QThread!
Verfasst: 11. August 2010 11:23
Hi there,
ich möchte immer mit einem udp server verbunden sein jedoch sollte meine gui nicht blockieren...
aus diesem grund habe ich den udp socket in einem thread ausgelagert...
der thread soll neben den lesen und verarbeiten der daten auch später noch signals verschicken (wurde noch nicht implementiert...)
der code funktioniert jedoch möchte ich wissen ob dieses design richtig ist...
Zu beginn der entwicklung hatte ich folgenden fehler "QObject: Cannot create children for a parent that is in a different thread. " und es wurde immer nur ein datagram gelesen...
Ich habe bei der slot connection folgendes verändert und danach lief alles: (DirectConnection hinzugefügt).
Bin ich auf dem richtigen weg?
vielen Dank
ich möchte immer mit einem udp server verbunden sein jedoch sollte meine gui nicht blockieren...
aus diesem grund habe ich den udp socket in einem thread ausgelagert...
der thread soll neben den lesen und verarbeiten der daten auch später noch signals verschicken (wurde noch nicht implementiert...)
der code funktioniert jedoch möchte ich wissen ob dieses design richtig ist...
Code: Alles auswählen
#include "uthread.h"
#include <iostream>
UThread::UThread(QObject* parent) : QThread(parent)
{
}
void UThread::run() {
//Setup
socket = new QUdpSocket();
socket->bind(QHostAddress::LocalHost, 2323);
QObject::connect(socket, SIGNAL(readyRead()), this, SLOT(readData()), Qt::DirectConnection);
exec();
}
void UThread::readData() {
while(socket->hasPendingDatagrams()) {
QByteArray datagram;
datagram.resize(socket->pendingDatagramSize());
QHostAddress sender;
quint16 port;
socket->readDatagram(datagram.data(), datagram.size(), &sender, &port);
parse(datagram);
}
}
void UThread::parse(QByteArray data) {
QString q(data);
std::cout << q.toStdString() << std::endl;
}
Ich habe bei der slot connection folgendes verändert und danach lief alles: (DirectConnection hinzugefügt).
Code: Alles auswählen
QObject::connect(socket, SIGNAL(readyRead()), this, SLOT(readData()), Qt::DirectConnection);
vielen Dank