QTcpSocket in QThread
-
20-09-2019 - |
Frage
Ich habe einfaches Server-Anschlussgewinde. Wenn Sie Funktion ReceiveString rufen, scheitert es. Allerdings, wenn Sie denselben Code in run () ausführen, es gelingt. Was ist für die Funktion ReceiveString zur Arbeit benötigt?
Ich habe versucht, beide
bool TestServerThread::receiveString(QTcpSocket& sock, QString& str)
bool TestServerThread::receiveString(QTcpSocket* sock, QString& str)
Die tatsächliche Code:
TestServerThread::TestServerThread(int socketDescriptor, QObject *parent) : QThread(parent), socketDescriptor(socketDescriptor)
{
}
bool TestServerThread::receiveString(QTcpSocket& sock, QString& str)
{
if(sock.isValid())
{
if(!sock.waitForReadyRead(30))
{
qWarning() << "fail"; // fails here
return false;
}
QByteArray buf = sock.readAll();
str = buf;
}
}
void TestServerThread::run()
{
QTcpSocket sock;
if (!sock.setSocketDescriptor(socketDescriptor)) {
emit error(sock.error());
return;
}
bool ok = true;
while(ok)
{
QString str;
//if(ok) ok = receiveString(sock, str);
if(!sock.waitForReadyRead(30))
{
qWarning() << "false";
}
QByteArray buf = sock.readAll(); // same routine succeeds
str = buf;
qWarning() << str;
qWarning() << "Received: " << str;
if(ok) ok = sendString(sock, "kaka");
}
sock.disconnectFromHost();
sock.waitForDisconnected();
}
Lösung
Entweder Ihr Code, um den Prozess-Stack ruiniert, oder Ihre Timeout-Wert ist nicht genug.
Andere Tipps
Was ist der Rückgabewert oder QTcpSocket::errorString()
?
//...
if(!sock.waitForReadyRead(30))
{
qWarning() << "fails " << sock.errorString(); // fails here
emit error(sock.error());
return false;
}
//...
Beachten Sie, dass in der Flucht, Sie werden immer die Daten auf dem Sockel zu lesen, auch wenn QTcpSocket::waitForReadyRead
false zurückgegeben.
Sind Sie sicher, dass Sie nicht den gleichen Fehler in den run
wie in receiveString
bekommen, aber die Lese erfolgreich, weil Sie diesen Fehler ignorieren?
Ist run
noch Erfolg, wenn Sie diesen Code verwenden:
bool ok = true;
while(ok)
{
QString str;
//if(ok) ok = receiveString(sock, str);
if(sock.waitForReadyRead(30))
{
QByteArray buf = sock.readAll(); // same routine succeeds
str = buf;
qWarning() << str;
qWarning() << "Received: " << str;
if(ok)
{
ok = sendString(sock, "kaka");
}
}
else
{
qWarning() << "fails " << sock.errorString();
ok = false;
}
}