0

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 を指定してメソッドを呼び出しますか? 何か案は ?

4

1 に答える 1

2

この応答を特定のスレッドの特定のソケットに配置できるかどうかを知りたいのですが、これまでに思いついた唯一のアイデアは、応答が到着したという信号を送信してすべてのスレッドを起動し、それがそれらへのメッセージ (ソケット記述子のチェックによる)。

いいえ、それはあなたのやり方ではありません。スレッドは従業員のようなものです。バーガーキングに行くときは、ジェーンを求めません。カウンターでジェフを見たら、彼のそばを通り過ぎて、ジェーンが注文を受け取るように後ろを探し回ったりはしません。彼女が顧客対応で忙しく、ジェフが対応可能であれば、ジェーンを待つ必要はありません。利用可能な最初のレジ係に注文を受けさせます。

ソケットでデータを受信したら、スレッド、任意のスレッドでその情報を処理します。どちらでも構いません。特定のスレッドにそれを強制する必要はありません。

スレッドについてはできるだけ考えないようにします。彼らは仕事をするだけの乗り物です。実行したい作業とそれを実行するためのコードに集中する必要があります。仕事を労働者に過度に割り当てるメカニズムについて考えなければならない場合は、何か間違ったことをしています。

レジ係 (料理ができない) と料理人 (注文を受け取れない) がいる場合は、仕事を終わらせるために適切な従業員を常に探し回る必要があります。しかし、すべてのスレッドは基本的に同等であり、あらゆるジョブを同等に実行できます。

于 2013-01-12T14:01:04.663 に答える