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); }
奇怪的是,如果我加上这一行: 连接(socketThread,&socketThread::started,&{socketThread->socket->write(“Hello!”);})//创建线程时向客户端写入消息 然后套接字将不会从客户端读取消息。如果我删除该行,套接字将从客户端读取消息。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(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()之间是否有区别
beforestarted
signal和beforestarted
signal.@TheodoreTang提供一个:)如果在连接到QThread::started
信号之前调用socketThread->start()
,我认为不能保证您能捕捉到该信号。@TheodoreTang QThread不是一个线程,它是一个线程处理程序(阅读文档),只有run()方法是属于该线程的部分。