gpt4 book ai didi

multithreading - 在自己的线程中将数据写入 TcpSocket

转载 作者:可可西里 更新时间:2023-11-01 02:32:40 25 4
gpt4 key购买 nike

我的线程 TCP 服务器出现问题。
我可以打开我的服务器,创建一个新的套接字,我可以通过套接字接收数据(我使用 readyRead() 信号然后使用 readLine() 读取,它工作正常。现在我想将数据写入这个套接字来自另一个线程,所以我创建了一个公共(public)插槽 writeData() 来处理这个问题。我将 writeData() 插槽与 QueuedConnection 连接(也尝试了 AutoConnection)但是当我调用 m_socket->write() 时我得到的只是一个错误留言:

QObject: Cannot create children for a parent that is in a different thread. (Parent is QNativeSocketEngine(0x12f0f70), parent's thread is ServerThread(0xfbbae8), current thread is QThread(0xfa7c48)

这里只是一个最小的例子:
我省略了从我的另一个线程到 writeData() 插槽的连接,因为我认为每个人都能想象得到;)

class Server : public QTcpServer {
Server();
protected:
void incomingConnection(int socketDesc);
}

Server::Server() : QTcpServer() {
this->listen(QHostAddress::Any, PORT);
}

void Server::incomingConnection(int socketDescriptor) {
ServerThread *t = new ServerThread(socketDescriptor);
t->start();
}

class ServerThread : public QThread {
ServerThread(int socketDescriptor);
protected:
void run();
public slots:
void writeData(QString data);
private:
int m_socketDescriptor;
QTcpSocket *m_socket;
}

ServerThread::ServerThread(int socketDescriptor) : QThread(), m_socketDescriptor(socketDescriptor) {}

void ServerThread::run() {
m_socket = new QTcpSocket();
m_socket->setSocketDescriptor(m_socketDescriptor);
exec();
}

void ServerThread::writeData(QString data) {
m_socket->write(data.toAscii());
}

提前致谢。

最佳答案

您的错误信息是指:

您的信号槽通信发生在创建并属于主线程的 ServerThread 实例上。但是 ServerThread 成员 m_socket 的实例已创建并且属于其他线程。

我建议您创建简单的 QThread 并将您的对象移入其中。

void Server::incomingConnection(int socketDescriptor) {
QThread *t = new QThread();
ClientConnection *client = new ClientConnection(socketDescriptor);
client->moveToThread(t);

// go
t->start();
}

class ClientConnection : public QObject {
Q_OBJECT
public:
ClientConnection(int socketDescriptor, QObject *parent = 0);
public slots:
void writeData(QString data);
private:
int m_socketDescriptor;
QTcpSocket *m_socket;
}

关于multithreading - 在自己的线程中将数据写入 TcpSocket,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4874844/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com