写入QTcpSocket失败,出现不同的线程错误

时间:2013-09-27 23:43:25

标签: multithreading qt qthread qtcpsocket qiodevice

我创建了一个简单的线程TCP服务器,它收集从套接字读取的3行,然后尝试将它们回送回套接字。下面的函数echoCommand崩溃。

#include "fortunethread.h"
#include <QtNetwork>
#include <QDataStream>

FortuneThread::FortuneThread(int socketDescriptor, QObject *parent)
    : QThread(parent), socketDescriptor(socketDescriptor), in(0)
{
}

void FortuneThread::run()
{
    tcpSocketPtr = new QTcpSocket;
    if (!tcpSocketPtr->setSocketDescriptor(socketDescriptor)) {
        emit error(tcpSocketPtr->error());
        return;
    }
    in = new QDataStream(tcpSocketPtr);
    connect(tcpSocketPtr, SIGNAL(readyRead()), this, SLOT(readCommand()) );
    QThread::exec();
}

void FortuneThread::echoCommand()
{
    QString block;
    QTextStream out(&block, QIODevice::WriteOnly);
    for (QStringList::Iterator it = commandList.begin(); it != commandList.end(); ++it) {
        out << "Command: " << *it << endl;
    }

    out << endl;
    tcpSocketPtr->write(block.toUtf8());
    tcpSocketPtr->disconnectFromHost();
    tcpSocketPtr->waitForDisconnected();
}

void FortuneThread::readCommand()
{
    while (tcpSocketPtr->canReadLine())
    {
        commandList << (tcpSocketPtr->readLine()).trimmed();
    }

    if (commandList.size() > 2)
    {
        echoCommand();
    }
}

这是我连接插槽/信号的文件:

#include "fortuneserver.h"
#include "fortunethread.h"

#include <stdlib.h>

FortuneServer::FortuneServer(QObject *parent)
    : QTcpServer(parent)
{
}

void FortuneServer::incomingConnection(qintptr socketDescriptor)
{
    QString fortune = fortunes.at(qrand() % fortunes.size());
    FortuneThread *thread = new FortuneThread(socketDescriptor, this);
    connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
    thread->start();
}

在套接字写入期间或之后,出现此错误:

**QObject: Cannot create children for a parent that is in a different thread.
(Parent is QNativeSocketEngine(0x7f19cc002720), parent's thread is FortuneThread(0x25411d0), current thread is QThread(0x220ff90)**

由于我在run()函数中创建了tcpSocketPtr,我知道它与此函数位于同一个线程中。为什么套接字写入失败?我应该指出写入是成功的,因为我在telnet窗口看到输出......但是套接字写入仍然失败......


更多信息......我发现我不应该在QThread中放置一个插槽......不确定如何解决这个问题,但这是我的课堂定义:

class FortuneThread : public QThread
{
    Q_OBJECT

public:
    FortuneThread(int socketDescriptor, QObject *parent);
    void run();

signals:
    void error(QTcpSocket::SocketError socketError);

private slots:
    void readCommand();

private:
    void echoCommand();
    int socketDescriptor;
    QDataStream *in;
    QStringList commandList;
    QTcpSocket *tcpSocketPtr;

};

0 个答案:

没有答案