Frage

Ich habe einen Server, mit dem mehrere Clients eine Verbindung herstellen kann. Der Client ist GUI, während der Server-Befehlszeile ist. Der Kunde hat mehrere Funktionen (wie zB Verbindung und Login), die, wenn sie auf den Server sollte eine Antwort erhalten gesendet.

Im Grunde muss ich die QTcpSocket Funktionen waitForConnection und waitForReadyRead auszuführen. Ich brauche aber dies zu tun, ohne die Benutzeroberfläche zu blockieren.

Was ich dachte, zu tun, war die folgende: Haben Sie eine Klasse (Client) QThread implementieren, die alle die Warte tut. Dies ist in der Haupt erstellt.

Client::Client (...)
{
    moveToThread (this); // Not too sure what this does
    mClient = new QTcpSocket (this);
    start();
}

void Client::run (void)
{
    exec();
}

void Client::connectToServer (...)
{
    mClient->connectToHost (hostname, port);
    bool status = mClient->waitForConnected (TIMEOUT);

    emit connected (status);
}

void Client::login (...)
{
    ... Similar to connectToServer ...
}

Dann wird die GUI (zum Beispiel ConnectToServerDialog) Ich betreiben diese, wann immer ich bin bereit, um eine Verbindung herzustellen. Ich verbinde das „connected Signal“ aus dem Thread zum Dialog so, wenn ich verbunden bin oder Verbindung abgelaufen es dieses Signal aussenden wird.

QMetaObject::invokeMethod (mClient, "connectToServer", Qt::QueuedConnection,
    Q_ARG (const QString &, hostname), Q_ARG (quint16, port));

Ich erhalte eine Assertion Scheitern mit diesem (kann nicht von einem anderen Thread gehört Ereignisse Objekte senden.) Da ich ziemlich neu bin auf Qt Ich weiß nicht, ob das, was ich tue das Richtige ist.

Kann jemand mir sagen, ob das, was ich tue, ist ein guter Ansatz, und wenn ja, warum ist mein Programm abstürzt?

War es hilfreich?

Lösung

ich nicht Anfang Thread im Konstruktor empfehlen.

initialisieren es wie:

Client * client = new Client();
client->moveToThread(client);
client->start();

Oder wenn Sie nicht wollen, eine solche Lösung verwenden, fügen Sie in Konstruktor vor start(); Linie this->moveToThread(this);

upd: sorry, ich habe nicht sieht zum ersten Mal, dass Sie diese Zeichenfolge haben

.

Andere Tipps

Das Beste ist, nie zu Call Methoden wie waitForBlah () ... zwingen die Ereignisschleife für eine unbestimmte Zeit einleitet zu warten, um die Möglichkeit der GUI während dieser Zeit einfriert. Stattdessen schließen Sie QTcpSocket die angeschlossene (Signal) zu einem gewissen Steckplatz, Ihre GUI entsprechend aktualisieren, und lassen Sie die Ereignisschleife wie gewohnt fortsetzen. Machen Sie Ihr on-verbundenes Zeug in diesem Slot.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top