QTcpSocket في QThread
-
20-09-2019 - |
سؤال
ولدي بسيط موضوع اتصال الخادم. عند استدعاء وظيفة receiveString، فإنه فشل. ولكن عند تنفيذ نفس رمز في المدى ()، فإنه ينجح. ما هو مطلوب من أجل وظيفة receiveString إلى العمل؟
ولقد حاول كل من
bool TestServerThread::receiveString(QTcpSocket& sock, QString& str)
bool TestServerThread::receiveString(QTcpSocket* sock, QString& str)
ورمز الفعلي:
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();
}
المحلول
وإما التعليمات البرمجية دمر كومة العملية، أو قيمة المهلة ليست كافية.
نصائح أخرى
ما هي قيمة الإرجاع أو QTcpSocket::errorString()
؟
//...
if(!sock.waitForReadyRead(30))
{
qWarning() << "fails " << sock.errorString(); // fails here
emit error(sock.error());
return false;
}
//...
ملحوظة أنه في المدى، كنت دائما قراءة البيانات على مأخذ، حتى لو عاد QTcpSocket::waitForReadyRead
كاذبة.
هل أنت متأكد أنك لا تحصل على نفس الخطأ في run
كما هو الحال في receiveString
، ولكن نجحت قراءة لأنك تجاهل هذا الخطأ؟
هل run
تزال تنجح إذا كنت تستخدم هذا الرمز:
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;
}
}
لا تنتمي إلى StackOverflow