C++ 多线程服务器无法从Qt中的客户端读取消息 尝试在QT中实现多线程服务器,请考虑以下事项:BR> 在SocketThread类中: SocketThread::SocketThread(qintptr descriptor, QObject *parent) : QThread(parent), socketDescriptor(descriptor) { socket = new QTcpSocket(); socket->setSocketDescriptor(socketDescriptor); socket->moveToThread(this); connect(socket, &QTcpSocket::readyRead, [this]() { qDebug() << socket->readAll(); }); //trying to read messages from clients } class SocketThread : public QThread { Q_OBJECT public: SocketThread(qintptr descriptor, QObject *parent = 0); ~SocketThread(); QTcpSocket *socket; qintptr socketDescriptor; }; Connection::Connection(QObject *parent) : QTcpServer(parent) { this->listen(QHostAddress::Any, 6666); }

C++ 多线程服务器无法从Qt中的客户端读取消息 尝试在QT中实现多线程服务器,请考虑以下事项:BR> 在SocketThread类中: SocketThread::SocketThread(qintptr descriptor, QObject *parent) : QThread(parent), socketDescriptor(descriptor) { socket = new QTcpSocket(); socket->setSocketDescriptor(socketDescriptor); socket->moveToThread(this); connect(socket, &QTcpSocket::readyRead, [this]() { qDebug() << socket->readAll(); }); //trying to read messages from clients } class SocketThread : public QThread { Q_OBJECT public: SocketThread(qintptr descriptor, QObject *parent = 0); ~SocketThread(); QTcpSocket *socket; qintptr socketDescriptor; }; Connection::Connection(QObject *parent) : QTcpServer(parent) { this->listen(QHostAddress::Any, 6666); },c++,qt,qt5,qtcpsocket,qtcpserver,C++,Qt,Qt5,Qtcpsocket,Qtcpserver,奇怪的是,如果我加上这一行: 连接(socketThread,&socketThread::started,&{socketThread->socket->write(“Hello!”);})//创建线程时向客户端写入消息 然后套接字将不会从客户端读取消息。如果我删除该行,套接字将从客户端读取消息。 我希望服务器在创建线程时向客户端发送消息,并从客户端读取消息。你怎样才能解决这个问题 编辑: SocketThread::SocketThread(qintptr descriptor, QObje

奇怪的是,如果我加上这一行:

连接(socketThread,&socketThread::started,&{socketThread->socket->write(“Hello!”);})//创建线程时向客户端写入消息

然后套接字将不会从客户端读取消息。如果我删除该行,套接字将从客户端读取消息。

我希望服务器在创建线程时向客户端发送消息,并从客户端读取消息。你怎样才能解决这个问题

编辑:

SocketThread::SocketThread(qintptr descriptor, QObject *parent)
    : QThread(parent), socketDescriptor(descriptor)
{
    socket = new QTcpSocket();
    socket->setSocketDescriptor(socketDescriptor);

    socket->moveToThread(this);

    connect(socket, &QTcpSocket::readyRead, [this]() { qDebug() << socket->readAll(); }); //trying to read messages from clients
} 
class SocketThread : public QThread
{
    Q_OBJECT
public:
    SocketThread(qintptr descriptor, QObject *parent = 0);
    ~SocketThread();
    QTcpSocket *socket;
    qintptr socketDescriptor;
};
Connection::Connection(QObject *parent) : QTcpServer(parent)
{
    this->listen(QHostAddress::Any, 6666);
}
SocketThread头文件:

SocketThread::SocketThread(qintptr descriptor, QObject *parent)
    : QThread(parent), socketDescriptor(descriptor)
{
    socket = new QTcpSocket();
    socket->setSocketDescriptor(socketDescriptor);

    socket->moveToThread(this);

    connect(socket, &QTcpSocket::readyRead, [this]() { qDebug() << socket->readAll(); }); //trying to read messages from clients
} 
class SocketThread : public QThread
{
    Q_OBJECT
public:
    SocketThread(qintptr descriptor, QObject *parent = 0);
    ~SocketThread();
    QTcpSocket *socket;
    qintptr socketDescriptor;
};
Connection::Connection(QObject *parent) : QTcpServer(parent)
{
    this->listen(QHostAddress::Any, 6666);
}
在连接构造函数中:

SocketThread::SocketThread(qintptr descriptor, QObject *parent)
    : QThread(parent), socketDescriptor(descriptor)
{
    socket = new QTcpSocket();
    socket->setSocketDescriptor(socketDescriptor);

    socket->moveToThread(this);

    connect(socket, &QTcpSocket::readyRead, [this]() { qDebug() << socket->readAll(); }); //trying to read messages from clients
} 
class SocketThread : public QThread
{
    Q_OBJECT
public:
    SocketThread(qintptr descriptor, QObject *parent = 0);
    ~SocketThread();
    QTcpSocket *socket;
    qintptr socketDescriptor;
};
Connection::Connection(QObject *parent) : QTcpServer(parent)
{
    this->listen(QHostAddress::Any, 6666);
}

以及在
main.cpp
文件中创建连接对象。这就像所有的代码一样

可能无关,但。。。在将任何东西连接到
QThread::started
信号之前,为什么要调用
socketThread->start()
?@G.M.不知道调用
socketThread->start()之间是否有区别
before
started
signal和before
started
signal.@TheodoreTang提供一个:)如果在连接到
QThread::started
信号之前调用
socketThread->start()
,我认为不能保证您能捕捉到该信号。@TheodoreTang QThread不是一个线程,它是一个线程处理程序(阅读文档),只有run()方法是属于该线程的部分。