首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QThread中的QTcpSocket

QThread中的QTcpSocket
EN

Stack Overflow用户
提问于 2009-10-09 12:56:01
回答 2查看 5.9K关注 0票数 1

我有简单的服务器连接线程。当您调用函数receiveString时,它会失败。但是,当您在run()中执行相同的代码时,它会成功。function receiveString需要什么才能工作?

我都试过了

代码语言:javascript
复制
bool TestServerThread::receiveString(QTcpSocket& sock, QString& str)
bool TestServerThread::receiveString(QTcpSocket* sock, QString& str)

实际代码:

代码语言:javascript
复制
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();
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-10-12 08:07:59

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

票数 3
EN

Stack Overflow用户

发布于 2009-10-12 07:49:53

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

代码语言:javascript
复制
//...
if(!sock.waitForReadyRead(30))
{
    qWarning() << "fails " << sock.errorString(); // fails here
    emit error(sock.error());
    return false;
}
//...

请注意,在运行过程中,即使QTcpSocket::waitForReadyRead返回false,您也始终在读取套接字上的数据。

您确定在run中没有得到与在receiveString中相同的错误,但是读取成功是因为您忽略了这个错误?

如果您使用以下代码,run是否仍然成功:

代码语言:javascript
复制
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;
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1543582

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档