Writing data to a TcpSocket in own Thread

multithreading, qt, tcp

Solution

Your error message means:

Your signal-slot communication happens on ServerThread instance which was created and belongs to main thread. However instance of ServerThread member m_socket was created and belongs to other thread.

I would suggest you to create simple `QThread` and move your object into it.

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;
}

Problem

I got a problem with my threaded TCP-Server. I can open my Server, a new Socket is created an I can receive data over the socket (I used the readyRead() signal and then used readLine() to read, which is working fine. Now I want to write data to this Socket from another Thread so I created a public slot writeData() which should take care of this. I connected the writeData() slot with QueuedConnection (also tried AutoConnection) but all I get when I call the m_socket->write() is an error message: 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) Just a minimal example here: I omitted the connect from my other Thread to the writeData() slot because I think everyone can imagine that ;) ``` 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()); } ``` Thanks in advance.

Original source