QTcpSocket::connectToHost() blockiert die GUI!

Alles rund um die Programmierung mit Qt
Antworten
jackmack
Beiträge: 13
Registriert: 1. Juni 2010 10:51

QTcpSocket::connectToHost() blockiert die GUI!

Beitrag 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
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

QTcpSocket blockiert nicht - Testcase damit wir sehen was dein Problem ist...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
jackmack
Beiträge: 13
Registriert: 1. Juni 2010 10:51

Beitrag 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
Dateianhänge
qsimplesocket.zip
(21.69 KiB) 173-mal heruntergeladen
jackmack
Beiträge: 13
Registriert: 1. Juni 2010 10:51

Beitrag 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

??
Antworten