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

Multithreading 写入QTcpSocket失败,出现不同的线程错误,multithreading,qt,qthread,qtcpsocket,qiodevice,Multithreading,Qt,Qthread,Qtcpsocket,Qiodevice,我创建了一个简单的线程化TCP服务器,它收集从套接字读取的3行数据,然后尝试将它们回显到套接字。下面的函数echoCommand崩溃 #include "fortunethread.h" #include <QtNetwork> #include <QDataStream> FortuneThread::FortuneThread(int socketDescriptor, QObject *parent) : QThread(parent), socketDe

我创建了一个简单的线程化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();
    }
}
因为我在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;

};

如何在run方法中创建指针?你能给我看一下相关的线路吗?这个tcpSocketPtr是您的FortuneThread类的成员吗?是的-FortuneServer.h文件定义了这个类,并且有私有成员:“QTcpSocket*tcpSocketPtr;”我们需要查看更多代码,Michelle。如何将插槽连接到其信号,如何准确构造堆对象等?我添加了第二个文件,用于启动线程并连接第一个插槽/信号,而第一个文件(运行中)连接readyRead的插槽/信号。建议不要继承
QThread
类<代码>QThead*T1=新的QThread();T1->start();对象->移动到线程(T1)更好
**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)**
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;

};