2009-10-09 4 views
1

У меня есть простой поток подключения к серверу. Когда вы вызываете функцию receiveString, она терпит неудачу. Однако, когда вы выполняете тот же код в run(), он преуспевает. Что нужно для функции receiveString для работы?QTcpSocket в QThread

Я попытался как

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(); 
} 
+0

Я попытался подклассов QTcpSocket, и я получаю тот же результат :( – Pavels

ответ

2

Либо ваш код испортил стек процесса, или ваше значение тайм-аута не достаточно.

+0

Мой глупый ошибка. Я предположил, что время ожидания в секундах, но настало время в миллисекундах. Спасибо за ваш ответ. Кстати, как я могу разрушить стек процесса? – Pavels

+0

Но ваше «время ожидания» одинаково для 'run' и 'receiveString'.Так что' run' должен завершиться ошибкой по той же причине! – TimW

+0

30 msec - действительно небольшой временной интервал. – Pavels

1

Что такое возвращаемое значение или 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; 
    } 
} 
+0

sock.errorString() возвращает «Сетевой режим тайм-аут» Это, конечно, в функции receiveString(). В перспективе() это удается. – Pavels

Смежные вопросы