folgenedes Probelm:
Ich lege einen QTCpServer an, der in einem Thread mit eigener Eventloop läuft. Das problem ist wenn ich den Server bende und die QTCPServer close bekomm ich ich meldung: "Cannot send events to objects owned by a different thread"
Ich habe versucht meinen Code aufs nötigste zu reduzieren.
Hier die Klasse, die das ThreadObjekt instanziert und damit arbeitet.
Code: Alles auswählen
class CommunicatorServerWindow : public QDialog, private Ui::CommunicatorServerWindowBase
{
Q_OBJECT;
...
}
CommunicatorServerWindow::CommunicatorServerWindow()
: QDialog()
{
setupUi(this);
pVideoServer = NULL;
...
}
void CommunicatorServerWindow::slotStartVideoServer()
{
pVideoServer = new VideoServer();
connect ( pVideoServer, SIGNAL( signalCreateStatusMessage(const QString&)),
this, SLOT( slotCreateStatusMessage(const QString&)) );
connect ( pVideoServer, SIGNAL( signalIncommingMessage(const QString&)),
this, SLOT( slotIncommingMessage(const QString&)));
pVideoServer->start();
}
void CommunicatorServerWindow::slotStopVideoServer()
{
pVideoServer->exit(0);
// pVideoServer->moveToThread(QApplication::instance()->thread()); // <-- Das hilft auch nichts bei meinem Problem
pVideoServer->stopServer();
disconnect ( pVideoServer, SIGNAL( signalCreateStatusMessage(const QString&)),
this, SLOT( slotCreateStatusMessage(const QString&)) );
disconnect ( pVideoServer, SIGNAL( signalIncommingMessage(const QString&)),
this, SLOT( slotIncommingMessage(const QString&)));
delete(pVideoServer);
pVideoServer = NULL;
}
und hier die ServerThread-Klasse:
Code: Alles auswählen
class VideoServer : public QThread
{
Q_OBJECT
...
}
VideoServer::VideoServer()
: port(0)
{
tcpServer = NULL;
tcpServer = new QTcpServer();
this->moveToThread(this);
}
void VideoServer::run()
{
QString hostname = "192.168.0.100";
int port = 5554;
serverAddress = QHostAddress(hostname);
if (tcpServer->listen(serverAddress, port))
{
connect(tcpServer, SIGNAL(newConnection()),
this, SLOT(slotClientConnected()) );
connect(RobotinoCom::Instance(), SIGNAL(signalSendImage(const QImage&)),
this, SLOT(slotSendMessage(const QImage&)) );
}
exec();
}
void VideoServer::stopServer()
{
if (NULL != tcpServer)
{
tcpServer->close(); // ### <--- hier tritt die Meldung auf
delete (tcpServer);
tcpServer = NULL;
}
}
Jemand eine Idee?
Grüße Rumbert