QWebsockets не будет работать в потоках?

Я пытался положить QWebSocket соединение в QThread

QThread *thread = new QThread;connect(&websocket,&QWebSocket::connected,this,&Widget::onWsConnect);

websocket.moveToThread(thread);
connect(thread, &QThread::finished, &websocket, &QObject::deleteLater);
websocket.open(wsUrl);

thread->start();

Программа скомпилирована без ошибок и работает нормально, но при попытке подключения к серверу websocket выдает эту ошибку:

QObject :: connect: Невозможно поставить в очередь аргументы типа ‘QAbstractSocket :: SocketState’
(Убедитесь, что QAbstractSocket :: SocketState зарегистрирован с использованием qRegisterMetaType ().)

Когда я делаю

websocket.open (wsUrl);

без резьбы соединение работает нормально.

Есть идеи?

1

Решение

Если вы хотите отправить свой объект через подключение к сигналу / слоту в очереди, вы должны использовать qRegisterMetaType<T>(), Просто вызовите его перед открытием сокета где-нибудь в конструкторе:

qRegisterMetaType<QAbstractSocket::SocketState>();
2

Другие решения

Предыдущий ответ (Неджата) хорош как прямой ответ о том, как в этом случае прикрепить сигнал к слоту. Но почему вы хотите запустить веб-сокет в дополнительном потоке? Я запускаю тот же Qt WebSocket из основного потока, и он не блокирует его. Время запуска такого типа сокетов само по себе ничтожно мало. Я предполагаю, что websocket использует некую блокировку ввода-вывода ОС (наиболее вероятно) или порождает другой поток внутри (менее вероятно). Помимо блокировки или выполнения массивных вычислений, у вас, вероятно, нет веских причин для создания нового потока, а затем позаботиться об управлении им и дополнительными коммуникационными издержками.

2

Мое предложение состояло бы в том, чтобы вести список открытых соединений веб-сокетов, и когда конкретное соединение получает запрос, порождает поток для его обработки и продолжает обрабатывать новые соединения / запросы в основном потоке. Затем, когда поток завершает обработку запроса, он сообщает основному потоку, что это сделано, вместе с ответом. Основной поток получит ответ от потока и отправит его через открытое соединение. Для этого вы можете использовать std :: async и std :: future.

1
По вопросам рекламы [email protected]