QTCPSOCKET QTHREAD
-
20-09-2019 - |
문제
간단한 서버 연결 스레드가 있습니다. 기능 채권을 호출하면 실패합니다. 그러나 run ()에서 동일한 코드를 실행하면 성공합니다. 기능을 채권하는 데 필요한 것은 무엇입니까?
나는 둘 다 시도했다
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