C++/Qt マルチスレッド サーバーを作成しています。これはより大きなアプリケーションの一部にすぎないため、受信したすべてのデータをキューに書き込む必要があります。誰かの他の部分がこの情報を処理して応答し、キューに入れます。
この応答を特定のスレッドの特定のソケットに配置できるかどうかを知りたいのですが、これまでに思いついた唯一のアイデアは、応答が到着したという信号を送信してすべてのスレッドを起動し、それがそれらへのメッセージ (ソケット記述子のチェックによる)。
私のコード:
thread.h
#pragma once
#include "socket.hpp"
#include <QThread>
class Thread : public QThread
{
Q_OBJECT
public:
Thread(int socketId, QObject *parent = 0);
void run();
signals:
void error(QTcpSocket::SocketError socketerror);
private:
int socketDescriptor;
};
スレッド.cpp
#include "thread.h"
#include <iostream>
Thread::Thread(int socketId, QObject *parent) :
QThread(parent), socketDescriptor(socketId)
{
}
void Thread::run()
{
Socket *tcpSocket = new Socket(socketDescriptor, this);
connect(tcpSocket, SIGNAL(connectionClosed()), SLOT(quit()));
exec();
}
ソケット.h
#pragma once
#include <QTcpSocket>
#include <boost/shared_ptr.hpp>
class Message;
class Socket : public QObject
{
Q_OBJECT
public:
Socket(int socketDescriptor, QObject* = 0);
~Socket();
bool isActive();
void emmiter();
signals:
void connectionClosed();
private slots:
void readClient();
void discardClient();
public slots:
void sendResponse(boost::shared_ptr<Message>);
private:
void disconnect();
quint16 nextBlockSize;
QTcpSocket* socket;
};
ソケット.cpp
void ClientSocket::sendResponse(boost::shared_ptr<Message> msg)
{
if(this->socket->socketDescriptor() == msg->conn.socket)
{
//actuall sending is not important
}
}
this ^ 上記は私が知っている方法ですが、特に多くのスレッドがあり、それらがすべて socketDescriptor() をチェックしている場合、それは良くないことを知っています。Message
また、シグナルスロットメカニズムで使用できるように、クラスからメタオブジェクトを作成する必要があります。1つのソケットのみに信号を送信したいと思います。どうすればできますか?ソケット オブジェクトをスレッドに配置し、スレッドに ID を指定してメソッドを呼び出しますか? 何か案は ?