За допомогою статті можна зробити контрольовану роботу QRunnable та QThreadPool у Qt.
Тобто передати результати роботу зовнішньому СЛОТУ.
Через симуляцію connect:
How to report progress and abort a long running operation with QRunnable and QThreadPool
P.S. Не забуваємо про попереднє використання qRegisterMetaType.
на кшталт
Тобто передати результати роботу зовнішньому СЛОТУ.
Через симуляцію connect:
QMetaObject::invokeMethod(receiver, "updateProgressBar",
Qt::QueuedConnection,
Q_ARG(int, pFinished));
How to report progress and abort a long running operation with QRunnable and QThreadPool
P.S. Не забуваємо про попереднє використання qRegisterMetaType.
на кшталт
qRegisterMetaType<QWebSocket*>();Адаптована програма з прикладів Qt з використанням QRunnable де нове з'єднання буде відпрацьовувати окремий код у окремому потоці, що дозволить приймати інші запити від QWebSocket.
server.h:
#ifndef SERVER_H
#define SERVER_H
#include <QtCore/QObject>
#include <QtCore/QList>
#include <QtCore/QByteArray>
#include <QRunnable>
#include <QWebSocket>
QT_FORWARD_DECLARE_CLASS(QWebSocketServer)
QT_FORWARD_DECLARE_CLASS(QWebSocket)
class EchoServer : public QObject
{
Q_OBJECT
public:
explicit EchoServer(quint16 port, bool debug = false, QObject *parent = Q_NULLPTR);
~EchoServer();
Q_SIGNALS:
void closed();
void command(QString command, QString &commandAnswer);
private Q_SLOTS:
void onNewConnection();
void processTextMessage(QString message);
void postProcessTextMessage(QWebSocket *socketDescriptor);
void postProcessTextMessage();
void processBinaryMessage(QByteArray message);
void socketDisconnected();
private:
QWebSocketServer *m_pWebSocketServer;
QList<QWebSocket *> m_clients;
bool m_debug;
};
SubSocket:
class SubSocket : public QRunnable
{
public:
explicit SubSocket(/*QObject *parent = Q_NULLPTR*/);
public slots:
// void process();
// void processTextMessage(QString message);
// void socketDisconnected();
signals:
//void finished(QWebSocket *socketDescriptor);
public:
QWebSocket *socketDescriptor=Q_NULLPTR;
EchoServer *receiver=Q_NULLPTR;
virtual void run();
private:
//QList<QWebSocket *> m_clients;
bool m_debug=true;
};
#endif //ECHOSERVER_H
server.cpp:
#include "server.h"
#include "QtWebSockets/qwebsocketserver.h"
#include "QtWebSockets/qwebsocket.h"
#include <QtCore/QDebug>
#include <QtCore/QThread>
#include <QThreadPool>
QT_USE_NAMESPACE
//! [constructor]
EchoServer::EchoServer(quint16 port, bool debug, QObject *parent) :
QObject(parent),
m_pWebSocketServer(new QWebSocketServer(QStringLiteral("Echo Server"),
QWebSocketServer::NonSecureMode, this)),
m_clients(),
m_debug(debug)
{
qRegisterMetaType<QAbstractSocket::SocketState>();
qRegisterMetaType<QWebSocket*>();
qDebug()<<"EchoServer()"<<QThread::currentThread();
if (m_pWebSocketServer->listen(QHostAddress::LocalHost, port)) {
if (m_debug)
qDebug() << "Echoserver listening on port" << port;
connect(m_pWebSocketServer, &QWebSocketServer::newConnection, this, &EchoServer::onNewConnection);
connect(m_pWebSocketServer, &QWebSocketServer::closed, this, &EchoServer::closed);
}
}
//! [constructor]
EchoServer::~EchoServer()
{
m_pWebSocketServer->close();
qDeleteAll(m_clients.begin(), m_clients.end());
}
//! [onNewConnection]
void EchoServer::onNewConnection()
{
QWebSocket *pSocket = m_pWebSocketServer->nextPendingConnection();
connect(pSocket, &QWebSocket::textMessageReceived, this, &EchoServer::processTextMessage);
connect(pSocket, &QWebSocket::binaryMessageReceived, this, &EchoServer::processBinaryMessage);
connect(pSocket, &QWebSocket::disconnected, this, &EchoServer::socketDisconnected);
m_clients << pSocket;
}
//! [onNewConnection]
//! [processTextMessage]
void EchoServer::processTextMessage(QString message)
{
QWebSocket *pClient = qobject_cast<QWebSocket *>(sender());
if (m_debug)
qDebug() << "Message received:" << message;
if (pClient) {
int sentbytes=pClient->sendTextMessage("OK");
pClient->flush();
SubSocket *ss=new SubSocket();
ss->socketDescriptor=pClient;
ss->receiver=this;
QThreadPool::globalInstance()->start(ss);
sentbytes=pClient->sendTextMessage("POST SubSocket");
pClient->flush();
}
}
void EchoServer::postProcessTextMessage(QWebSocket *socketDescriptor)
{
qDebug()<<"EchoServer::postProcessTextMessage(QWebSocket *socketDescriptor)"<<QThread::currentThread()<<socketDescriptor;
if (socketDescriptor != Q_NULLPTR){
socketDescriptor->sendTextMessage("COMMAND PROCEED");
socketDescriptor->sendTextMessage("END");
socketDescriptor->close();
}
}
//! [processTextMessage]
//! [processBinaryMessage]
void EchoServer::processBinaryMessage(QByteArray message)
{
QWebSocket *pClient = qobject_cast<QWebSocket *>(sender());
if (m_debug)
qDebug() << "Binary Message received:" << message;
if (pClient) {
pClient->sendBinaryMessage(message);
}
}
//! [processBinaryMessage]
//! [socketDisconnected]
void EchoServer::socketDisconnected()
{
QWebSocket *pClient = qobject_cast<QWebSocket *>(sender());
if (m_debug)
qDebug() << "socketDisconnected:" << pClient;
if (pClient) {
m_clients.removeAll(pClient);
pClient->deleteLater();
}
}
//! [socketDisconnected]
SubSocket::SubSocket()
{
}
void SubSocket::run()
{
qDebug()<<"SubSocket::run()"<<QThread::currentThread();
qDebug()<<"SubSocket::run() sleep start";
QThread::sleep(10);
qDebug()<<"SubSocket::run() sleep stop";
QMetaObject::invokeMethod(receiver, "postProcessTextMessage",
Qt::QueuedConnection,
Q_ARG(QWebSocket*, socketDescriptor));
}
Немає коментарів:
Дописати коментар