私はthis pageは、あなたの答えを保持していると思う:
あなたは 他のスレッドにsocketDescriptorを渡し、QTcpSocketオブジェクトを作成する必要があり、別のスレッドで新しいQTcpSocket オブジェクトとして着信接続を処理する場合setSocketDescriptor()メソッドの を使用してください。
これを行うには、QTcpServer
から継承し、仮想メソッドincomingConnection
を上書きする必要があります。
このメソッド内で、子ソケットの新しいQTcpSocket
を作成する子スレッドを作成します。例えば
:
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<QTcpSocket> 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
}
};
やソケットにmoveToThread()
を使用するようにしてください。
moveToThread()はQThreadでのみ動作するようですが、私はQRunnableを使用しています。 – CDT
'socketDescriptor'を' TCPConnectThread'コンストラクタに渡して、 'run'メソッドのスレッドに新しい' QTcpSocket'を作成しようとします。 –
本当にありがとう!しかし、時々私は新しいQTcpSocketからデータを読み取ることに失敗することがあることを知りました。約10回に1回です。理由は分かりますか?ここ – CDT