Russian Qt Forum
Сентябрь 28, 2020, 11:47 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Можно ли делать QWebSocket в дочернем потоке?  (Прочитано 1624 раз)
neosapient1
Новичок

Offline Offline

Сообщений: 1


Просмотр профиля
« : Январь 29, 2020, 19:58 »

Здравствуйте.

Пишу приложение 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

Спасибо.
« Последнее редактирование: Январь 29, 2020, 20:00 от neosapient1 » Записан
qate
Супер
******
Offline Offline

Сообщений: 1065


Просмотр профиля
« Ответ #1 : Январь 30, 2020, 09:40 »

"Правильная работа с потоками в Qt" https://habr.com/ru/post/467261/
Лучше покажи минимальный пример, где QWebSocket тормозит, возможно там уже все не так.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.135 секунд. Запросов: 22.