QThreadでQTcpSocket
-
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
がfalseを返された場合でも、実行中に、あなたは常にソケット上のデータを読んでいることに注意してください。
あなたは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