Multithreading QThread中的qtcsocket

Multithreading QThread中的qtcsocket,multithreading,qt,qthread,Multithreading,Qt,Qthread,我有一个简单的服务器连接线程。调用函数receiveString时,它会失败。但是,当您在run()中执行相同的代码时,它会成功。函数receiveString需要什么才能工作 我两个都试过了 bool TestServerThread::receiveString(QTcpSocket& sock, QString& str) bool TestServerThread::receiveString(QTcpSocket* sock, QString& str) 实际

我有一个简单的服务器连接线程。调用函数receiveString时,它会失败。但是,当您在run()中执行相同的代码时,它会成功。函数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();
}
TestServerThread::TestServerThread(int-socketDescriptor,QObject*parent):QThread(parent),socketDescriptor(socketDescriptor) { } bool TestServerThread::receiveString(qtcsocket&sock、QString&str) { if(sock.isValid()) { 如果(!sock.waitForReadyRead(30)) {
qWarning()返回值是什么或
qtcSocket::errorString()


什么是返回值或
QTcpSocket::errorString()


要么你的代码破坏了进程堆栈,要么你的超时值不够。

要么你的代码破坏了进程堆栈,要么你的超时值不够。

我尝试过对QTcpSocket进行子类化,得到了相同的结果:(我尝试过对QTcpSocket进行子类化,得到了相同的结果:(sock.errorString()返回“网络操作超时”函数receiveString()中的当然成功。在run()中成功。sock.errorString()返回“网络操作超时”。函数receiveString()中的当然成功。在run()中成功。我愚蠢的错误。我假设等待时间以秒为单位,但它是以毫秒为单位的时间。谢谢你的回答。顺便说一句,我如何破坏进程堆栈?但是你的“暂停“在
run
receiveString
上也是如此。因此
run
应该会因为同样的原因失败!30毫秒的时间范围真的很小。更好的理解方法是:如果在receiveString中,堆栈越深。我的同事经历的是:堆栈越深,多任务操作系统上的进程和线程上下文切换越慢。run()只是一个QT线程,它与其他线程和进程共享CPU时间。顺便说一句,正常的RTT是50ms。我愚蠢的错误。我假设等待时间以秒为单位,但它是以毫秒为单位的时间。谢谢你的回答。顺便说一句,我怎么能破坏进程堆栈?但是你的“等待超时”在
run
receiveString
上也是如此。因此
run
应该会因为同样的原因失败!30毫秒的时间范围真的很小。更好的理解方法是:如果在receiveString中,堆栈越深。我的同事经历的是:堆栈越深,多任务操作系统上的进程和线程上下文切换越慢。run()只是一个QT线程,它与其他线程和进程共享CPU时间。顺便说一句,正常的RTT是50ms。
//...
if(!sock.waitForReadyRead(30))
{
    qWarning() << "fails " << sock.errorString(); // fails here
    emit error(sock.error());
    return false;
}
//...
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;
    }
}