Qt – Gère QTcpSocket dans un nouveau thread

Essayer de gérer un socket client connecté dans un nouveau thread à partir du pool de threads global:

m_threadPool = QThreadPool::globalInstance(); void TCPListenerThread::onNewConnection() { QTcpSocket *clientSocket = m_tcpServer->nextPendingConnection(); clientSocket->localPort(); m_connectThread = new TCPConnectThread(clientSocket); m_threadPool->start(m_connectThread); } 

Voici TCPConnectThread :

 class TCPConnectThread : public QRunnable { TCPConnectThread::TCPConnectThread(QTcpSocket *_socket) { m_socket = _socket; this->setAutoDelete(false); } void TCPConnectThread::run() { if (! m_socket->waitForConnected(-1) ) qDebug("Failed to connect to client"); else qDebug("Connected to %s:%d %s:%d", m_socket->localAddress(), m_socket->localPort(), m_socket->peerAddress(), m_socket->peerPort()); if (! m_socket->waitForReadyRead(-1)) qDebug("Failed to receive message from client") ; else qDebug("Read from client: %s", QSsortingng(m_socket->readAll()).toStdSsortingng().c_str()); if (! m_socket->waitForDisconnected(-1)) qDebug("Failed to receive disconnect message from client"); else qDebug("Disconnected from client"); } } 

J’ai eu des erreurs sans fin avec ceux-ci. Il semble QTcpSocket gestion de QTcpSocket threads ne soit pas réalisable (voir la réponse de Michael).

Quelques erreurs:

 QSocketNotifier: socket notifiers cannot be disabled from another thread ASSERT failure in QCoreApplication::sendEvent: "Cannot send events t objects owned by a different thread. 

Devrais-je gérer QTcpSocket dans un autre thread?
Que dois-je faire si je veux gérer QTcpSocket dans un autre thread?
Ou existe-t-il un moyen de créer un QTcpSocket partir d’un descripteur de fichier?

Je pense que cette page contient votre réponse:

Si vous souhaitez gérer une connexion entrante en tant que nouvel object QTcpSocket dans un autre thread, vous devez transmettre le socketDescriptor à l’autre thread, créer l’object QTcpSocket et utiliser sa méthode setSocketDescriptor ().

Pour ce faire, vous devrez hériter de QTcpServer et remplacer la méthode virtuelle incomingConnection .

Dans cette méthode, créez le thread enfant qui créera un nouveau QTcpSocket pour le socket enfant.

Par exemple:

 class MyTcpServer : public QTcpServer { protected: virtual void incomingConnection(int socketDescriptor) { TCPConnectThread* clientThread = new TCPConnectThread(socketDescriptor); // add some more code to keep track of running clientThread instances... m_threadPool->start(clientThread); } }; class TCPConnectThread : public QRunnable { private: int m_socketDescriptor; QScopedPointer m_socket; public: TCPConnectionThread(int socketDescriptor) : m_socketDescriptor(socketDescriptor) { setAutoDelete(false); } protected: void TCPConnectThread::run() { m_socket.reset(new QTcpSocket()); m_socket->setSocketDescriptor(m_socketDescriptor); // use m_socket } }; 

ou essayez d’utiliser moveToThread() sur le socket.