QObject::connect в QRunnable - консоль

Я создаю простой многопоточный сервер:

  • Создать сервер
  • Если новое соединение создайте новый QThreadpool - QRunnable
  • В runnable отправить сообщение клиенту и дождаться запроса
  • Если клиент был отключен, runnable напишите qDebug и runnable выйдет.

сервер.ч

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);
}

работающий.ч

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";
}

person Community    schedule 18.11.2013    source источник


Ответы (1)


Вы, кажется, забыли задать вопрос, но вот непосредственная проблема, которую я заметил в вашем коде: ваш класс Runnable не наследуется от QObject и, следовательно, не может иметь сигналы и слоты. Вам нужно будет сделать это, чтобы иметь надежду заставить его работать.

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

protected:
  void run();

public slots:
  void disconnectCln();
};

Здесь следует отметить две важные вещи. 1) если вы используете множественное наследование, QObject должно стоять первым в списке. 2) Чтобы использовать сигналы и слоты, вы должны включить макрос Q_OBJECT в определение вашего класса.

person Dan Milburn    schedule 18.11.2013
comment
Большое спасибо! :) - person ; 19.11.2013