Seite 1 von 1

QTcpSocket::connectToHost() blockiert die GUI!

Verfasst: 16. Dezember 2010 13:28
von jackmack
Hallo zusammen,

ich arbeite mit Qt 4.7.0 unter XP mit VS2008.

Ich bin dabei, ne Socket-Klasse zu entwerfen, die sich als Client auf nen Server verbindet.

Starte ich jetzt meine Client-Anwendung und versuche mich zu verbinden, der Server aber nicht läuft, dann blockiert für kurze Zeit die GUI!

Als Reconnect-Mechanismus hab ich die Signals / Slots mit einander verbunden, also sowas:

...
m_socket = new QTcpSocket();

connect(m_socket, SIGNAL(readyRead()),
this, SLOT(slotReadData()));

connect(m_socket, SIGNAL(error(QAbstractSocket::SocketError)),
this, SLOT(slotError(QAbstractSocket::SocketError)));

connect(m_socket, SIGNAL(connected()),
this, SLOT(slotConnected()));

connect(m_socket, SIGNAL(disconnected()),
this, SLOT(slotDisconnected()));
...

Innerhalb von slotError() und slotDisconnected() rufe ich dann erneut m_socket::connectToHost() auf.

Aber auch selbst wenn ich den Reconnect-Mechanismus weglasse und der Server nicht läuft, blockiert kurz die GUI beim ersten und einzigen Aufruf.

Dachte QTcpSocket ist asynchron, d.h. hier wird nix mehr blockiert und alles wird mit den Signals gemacht. Ich habe auch schon Beiträge u. Bsp. gelesen, die QTcpSocket in eine QThread::run() verfrachten. Aber dann verstehe ich wohl das "asynchrone" wohl falsch und QTcpSocket ist doch blockierend.

Kann mich bitte mal einer aufklären?

Danke...
jackmack

Verfasst: 17. Dezember 2010 20:39
von Christian81
QTcpSocket blockiert nicht - Testcase damit wir sehen was dein Problem ist...

Verfasst: 20. Dezember 2010 11:43
von jackmack
Gerne, hier im Anhang ein kleines Beispiel.

Einfach während des "reconnecten" das Fenser der App im Kreis bewegen, dann siehste das Blockieren.

Falls meine reconnect Funktion falsch implementiert ist, wäre ich dankbar wenn mir jemand eine passende Lösung hat, da ich irgendwie die Signals/Slots wohl falsch verstanden habe.

Danke im vorraus...

jackmack

Verfasst: 20. Dezember 2010 12:36
von jackmack
Christian81 hat geschrieben:QTcpSocket blockiert nicht - Testcase damit wir sehen was dein Problem ist...
Eben ausprobiert,... selbst das Qt Beispiel FortuneClient ist blockierend (oder zumindest was ich darunter verstehe!).

Einfach FortuneClient starten, irgendeinen Port eingeben, dann sofort das Fenster im Kreis bewegen. Dann siehste, dass das Fenster kurz darauf ruckelt, also kurz blockiert. Dann gehts weiter und dann geht auch schon die QMessageBox auf.

Meine Erklärung:
Der Aufruf von connectToHost() ist BLOCKIEREND! Der dauert einfach nen kurzen Moment weil der Port nicht verfügbar ist! Dann sprint auch schon der slot displayError() an, der dann nen QMessageBox ausgibt. Das die blockiert ist ok.

Wie darf ich "two general approaches" verstehen: http://doc.qt.nokia.com/4.7/network-fortuneclient.html

??