Здравствуйте.
Пишу приложение GUI + QWebSocket. Программа принимает большой объем данных по QWebSocket, и видно как GUI тормозит.
Чтобы интерфейс пользователя не тормозил, хочу вынести GUI в дочерний поток.
В общем, написал тестовый класс Thread.
В процессе тестов выяснил, что объект QWebSocket должен создаваться в самом дочернем потоке.
В программе не работает webSocket->close(). Программа выкидывает ошибку. Как исправить?thread.h#ifndef THREAD_H
#define THREAD_H
#include <QObject>
#include <QThread>
#include <QtWebSockets/QWebSocket>
class Thread: public QThread
{
Q_OBJECT
public:
Thread();
void run();
Q_SIGNALS:
void closed();
private Q_SLOTS:
void onConnected();
void onRead(QString message);
void onClosed();
public:
QWebSocket *p_webSocket;
};
#endif // THREAD_H
thread.cpp#include "thread.h"
Thread::Thread()
: p_webSocket(NULL)
{}
void Thread::run()
{
while(true){
QWebSocket webSocket; // <-- создаю объект тут
p_webSocket = &webSocket;
connect(p_webSocket, &QWebSocket::connected, this, &Thread::onConnected);
connect(p_webSocket, &QWebSocket::disconnected, this, &Thread::onClosed);
p_webSocket->open(QUrl("wss://echo.websocket.org/"));
exec();
}
}
void Thread::onConnected()
{
qDebug() << "WebSocket connected";
connect(p_webSocket, &QWebSocket::textMessageReceived,
this, &Thread::onRead);
p_webSocket->sendTextMessage(QStringLiteral("test"));
}
void Thread::onRead(QString message)
{
qDebug() << "Message received:" << message;
disconnect(p_webSocket, &QWebSocket::textMessageReceived,
this, &Thread::onRead);
p_webSocket->close(); // <--- тут происходит ошибка
}
void Thread::onClosed()
{
qDebug() << "onClosed";
}
main.cpp
#include <QCoreApplication>
#include "thread.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Thread thread;
thread.start();
return a.exec();
}
ОшибкаQSocketNotifier: Socket notifiers cannot be enabled or disabled from another thread
QSocketNotifier: Socket notifiers cannot be enabled or disabled from another thread
QSocketNotifier: Socket notifiers cannot be enabled or disabled from another thread
QObject::connect: Cannot queue arguments of type 'QAbstractSocket::SocketState'
(Make sure 'QAbstractSocket::SocketState' is registered using qRegisterMetaType().)
ASSERT failure in QCoreApplication::sendEvent: "Cannot send events to objects owned by a different thread. Current thread 2dd1c48. Receiver '' (of type 'QNativeSocketEngine') was created in thread 9bfed4", file kernel\qcoreapplication.cpp,line 568
Спасибо.