Solved QThread richtig einsetzen?
-
This post is deleted! -
@Galilio
hi,Warum bestehst du eigentlich auf einer Synchronen TCPSocket Lösung? Wenn möglich sollte man immer die Asynchronen Funktionen nehmen.
Das gesagt,
waitForDisconnected
hat in der docu den BeisatzNote: This function may fail randomly on Windows. Consider using the event loop and the disconnected() signal if your software will run on Windows.
Also besondere Vorsicht die man hier walten lassen sollte.
if ((GetTcpSocket()->state() == QAbstractSocket::UnconnectedState) || (GetTcpSocket()->waitForDisconnected(GetTimeOut())))
ist an sich nicht falsch, der erste Parameter wird immer zuerst geprüft, und falls true, wird der Rest des IF-Statements ignoriert.
Ist aber trotzdem eine blockierende Funktion und wird deinen Thread für bis zu 3 Sekunden, der default timeout, freezen.Ich würde es etwas anders lösen, und zwar über das Signal
stateChanged
vom TcpSocketconnect(tcpSocket, &QTcpSocket::stateChanged, this, [=](QAbstractSocket::SocketState socketState{ if(socketState == ConnectedState) emit SocketConnected(); if(socketState == UnconnectedState) emit SocketDisconnected(); });
einen Timeout kannst du dir ganz leicht selbst machen mit einem QTimer
void disconnectMySocket(){ tcpSocket->disconnectFromHost(); QTimer::singleShot(3000, this, &mySocketClass::checkDisconnected); } void checkDisconnected(){ if(tcpSocket->state != UnconnectedState){ //Error Handling } }
-
@J.Hilk
vielen dank
Dein tipps sind super -
@J.Hilk
Hi,Das
void disconnectMySocket(){ tcpSocket->disconnectFromHost(); QTimer::singleShot(3000, this, &mySocketClass::checkDisconnected); } void checkDisconnected(){ // Diese Funktion wird aber ne aufgerufen if(tcpSocket->state != UnconnectedState){ //Error Handling } }
wird aber ne erreicht.
-
@Galilio
mit ziehmlicher sicherheit wird das aufgerufen x), Fehlermeldungen falls vorhanden immer mit posten.Ich hab das so vereinfacht geschrieben wie möglich, das muss an dein Programm angepasst werden.
wenn die den Slot vermeiden möchtest kann man das auch in ein Lamda stecken.
Das wird auf jeden Fall aufgerufen, oder zumindest wird der compiler abbrechen mit einer Fehlermeldung:void disconnectMySocket(){ tcpSocket->disconnectFromHost(); QTimer::singleShot(3000, this, [=]{ if(tcpSocket->state != UnconnectedState){ //Error Handling } }); }
-
@J.Hilk
aber wenn ich so schreibe :void disconnectMySocket(){ tcpSocket->disconnectFromHost(); QTimer::singleShot(3000, this, [=]{ qDebug() << "checkDisonnected"; if(tcpSocket->state() != UnconnectedState){ //Error Handling } }); }
dann muss er rein aber der tut es nicht.
Hier wird der SocketConnect bzw. SocketDisconnected emitted und das entsprechende Slot aufgerufen
connect(GetTcpSocket(), &QTcpSocket::stateChanged, this, [=](QAbstractSocket::SocketState socketState) { if (socketState == QAbstractSocket::ConnectedState) { qDebug() << "Connected"; emit SocketConnected(); } if (socketState == QAbstractSocket::UnconnectedState) { qDebug() << "Disconnected"; emit SocketDisconnected(); } });
-
@Galilio said in QThread richtig einsetzen?:
disconnectMySocket()
setze mal einen Breakpoint oder eine qDebug() line um zu schaun, ob
disconnectMySocket()
überhaupt aufgerufen wird. -
Das habe ich gemacht.
disconnectMySocket()
Dieses wird schon aufgerufen, aber
checkDisconnected()
wird ne aufgerufen.
-
@Galilio mmh
#include <QTimer>
ist gemacht? Clean Build durchgeführt? Eventuell ShadowBuild-Ordner löschen. -
@J.Hilk said in QThread richtig einsetzen?:
@Galilio mmh
#include <QTimer>
ist gemacht? Clean Build durchgeführt? Eventuell ShadowBuild-Ordner löschen.
habe ich gemacht