QT Multithreaded Statefull Server
Verfasst: 6. November 2009 01:32
------
Das deutschsprachige Forum rund um Qt
https://www.qtforum.de/
Code: Alles auswählen
sock->connectToHost(QString("127.0.0.1"),(qint16)1643);
sock->waitForConnected(-1);Also weglassen und waitForBytesWritten aufrufen! Oder -meine Meinung- direkt nach dem write() und anschliessend waitForBytesWritten() aufrufen. Wird aber nichts am Problem ändern.... In the absence of an event loop, call waitForBytesWritten() instead.
Ich würde an deiner Stelle genauestens überlegen, ob du eine multi-threaded Lösung überhaupt brauchst. Meine Erfahrung zeigt, dass die Benutzung von mehr als 2 Threads innerhalb einer Anwendung oft die Folge von falschen architektonischen Entscheidungen ist...psy_cho hat geschrieben:Ich hab damit in Verbindung von OpenGL und QT sehr schlechte Erfahrungen gemacht. Was laut doku hätte funktionieren müssen tat es nicht wie ihm geheißen.
Ich hab nix gegen echte Signals, so wie sie zwischen Posix Threads oder Prozessen gesendet werden können. Weil ich da entscheide in welchem Thread diese abgearbeitet werden.
Ich bin generell kein freund dieser Callback Konzepte, da man bei multithreaded Anwendungen recht schnell aus den Augen verlieren kann in welchem Kontext den nun eine Methode aufgerufen wird.
Ich tendiere eher zu transparentem Informationsfluss innerhalb einer Anwendung.
Ich hab natürlich auch nichts gegen eine Signal Slot Lösung. Wenn sie multithreaded arbeitet und gut funktioniert.
Mfg
Marc
Code: Alles auswählen
#ifndef _PING_
#define _PING_
#include <QThread>
class Ping: public QThread
{
public:
virtual void run();
};
#endif
Code: Alles auswählen
#ifndef _PONG_
#define _PONG_
#include <QThread>
class Pong: public QThread
{
public:
virtual void run();
};
#endifCode: Alles auswählen
#include <QDebug>
#include <QTcpSocket>
#include <QTcpServer>
#include "ping.h"
void Ping::run()
{
QTcpServer primaryServer;
qDebug() << "Ping: warte auf Client";
primaryServer.listen(QHostAddress::Any,1643);
primaryServer.waitForNewConnection(-1);
QTcpSocket* newConnection = primaryServer.nextPendingConnection();
newConnection->waitForConnected(-1);
qDebug() << "Ping: Verbunden";
while (1) {
qDebug() << "Ping: sende ping";
newConnection->write("ping");
newConnection->waitForBytesWritten(-1);
qDebug() << "Ping: warte auf Antwort";
newConnection->waitForReadyRead(-1);
qDebug() << "Ping: Antwort erhalten" << newConnection->readAll();
}
}Code: Alles auswählen
#include <QDebug>
#include <QTcpSocket>
#include "pong.h"
void Pong::run()
{
QTcpSocket newConnection;
do {
newConnection.connectToHost("localhost",1643);
} while (!newConnection.waitForConnected(1000));
qDebug() << "Pong: Verbunden";
while (1) {
qDebug() << "Pong: warte auf Antwort";
newConnection.waitForReadyRead(-1);
qDebug() << "Pong: Antwort erhalten" << newConnection.readAll();
qDebug() << "Pong: sende pong";
newConnection.write("pong");
newConnection.waitForBytesWritten(-1);
}
}Code: Alles auswählen
#include <QCoreApplication>
#include "ping.h"
#include "pong.h"
int main(int argc, char *argv[])
{
QCoreApplication app(argc,argv);
Ping t1;
Pong t2;
t1.start();
t2.start();
return app.exec();
}Das Beispiel funktioniert doch, oder nicht?Soweit so gut. Das Problem taucht jetzt beim Auslesen auf.
Warte ich mit QTcpSocket::waitForReadyRead(-1) blockierend auf Input vom Socket ist der Ofen aus. Der Thread blockiert.