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

时间:2011-02-02 13:11:21

标签: multithreading qt tcp

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

  

QObject:无法为不同线程中的父级创建子级。   (Parent是QNativeSocketEngine(0x12f0f70),父节点的线程是ServerThread(0xfbbae8),   当前线程是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());
}

提前致谢。

1 个答案:

答案 0 :(得分:5)

您的错误消息表示:

您的信号槽通信发生在 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;
}