4

シンプルなマルチスレッド サーバーを作成します。

  • サーバーの作成
  • 新しい接続が新しい QThreadpool を作成する場合 - QRunnable
  • 実行可能な状態でクライアントにメッセージを送信し、リクエストを待ちます
  • クライアントが切断された場合は、runnable に qDebug を書き込み、runnable を終了します。

server.h

class Server : public QTcpServer
{
Q_OBJECT
public:
explicit Server(QObject *parent = 0);
void StartServer();

protected:
void incomingConnection(int handle);

private:
QThreadPool *pool;
};

サーバー.cpp:

#include "server.h"

Server::Server(QObject *parent) :
QTcpServer(parent)
{
pool = new QThreadPool(this);
pool->setMaxThreadCount(10);
}

void Server::StartServer()
{
this->listen(QHostAddress(dts.ipAddress),80));
}

void Server::incomingConnection(int handle)
{
Runnable *task = new Runnable();
task->setAutoDelete(true);

task->SocketDescriptor = handle;
pool->start(task);
}

runnable.h

class Runnable : public QRunnable
{
public:
Runnable();
int SocketDescriptor;

protected:
void run();

public slots:
void disconnectCln();
};

runnable.cpp

#include "runnable.h"

Runnable::Runnable()
{

}

void Runnable::run()
{
if(!SocketDescriptor) return;

QTcpSocket *newSocketCon = new QTcpSocket();
newSocketCon->setSocketDescriptor(SocketDescriptor);

!!! 作り方???!!!! QObgect::connect(newSocketCon, SIGNAL(disconnected()), this, SLOTS(disconnectCln()));

newSocketCon->write(mes.toUtf8().data());
newSocketCon->flush();
newSocketCon->waitForBytesWritten();
}

void Runnable::disconnectCln()
{
qDebug() << "Client was disconnect";
}
4

1 に答える 1

16

あなたは実際に質問することを怠っているように見えますが、あなたのコードで私が見つけた差し迫った問題は次のとおりです: あなたの Runnable クラスは QObject から継承されていないため、シグナルとスロットを持つことができません。それを機能させる希望を持たせるには、それを行う必要があります。

class Runnable : public QObject, public QRunnable
{
  Q_OBJECT
public:
  Runnable();
  int SocketDescriptor;

protected:
  void run();

public slots:
  void disconnectCln();
};

ここで注意すべき重要な点が 2 つあります。1) 多重継承を使用する場合QObjectは、リストの最初に来る必要があります。2) シグナルとスロットを使用するにはQ_OBJECT、クラス定義にマクロを含める必要があります。

于 2013-11-18T13:59:30.820 に答える