2009-10-09 4 views
1

J'ai un thread de connexion au serveur simple. Lorsque vous appelez la fonction receiveString, elle échoue. Cependant, lorsque vous exécutez le même code dans run(), il réussit. De quoi a besoin la fonction receiveString pour fonctionner?QTcpSocket dans QThread

J'ai essayé deux

bool TestServerThread::receiveString(QTcpSocket& sock, QString& str) 
bool TestServerThread::receiveString(QTcpSocket* sock, QString& str) 

Code actuel:

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

J'ai essayé QTcpSocket le sous-classement, et je reçois même résultat :( – Pavels

Répondre

2

Soit votre code ruiné la pile de processus, ou votre valeur de délai d'attente ne suffit pas.

+0

Mon stupide J'ai supposé que le temps d'attente est en secondes, mais il est temps en millisecondes.Merci de votre réponse.Btw, comment je peux ruiner la pile de traitement? – Pavels

+0

Mais votre "temps d'attente" est le même pour sur "courir" – TimW

+0

30 msec est vraiment un peu de temps, – Pavels

1

Quelle est la valeur de retour ou QTcpSocket::errorString()?

//... 
if(!sock.waitForReadyRead(30)) 
{ 
    qWarning() << "fails " << sock.errorString(); // fails here 
    emit error(sock.error()); 
    return false; 
} 
//... 

Notez que dans la course, vous lisez toujours les données sur la prise, même si QTcpSocket::waitForReadyRead retourne faux.
Etes-vous sûr de ne pas avoir la même erreur dans le run que dans receiveString, mais la lecture réussit car vous ignorez cette erreur?

Est-run toujours réussir si vous utilisez ce code:

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

retours sock.errorString() « opération de réseau a expiré » Ce bien sûr en fonction receiveString(). Dans l'essai() réussit. – Pavels

Questions connexes