Я пытался положить 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);
без резьбы соединение работает нормально.
Есть идеи?
Если вы хотите отправить свой объект через подключение к сигналу / слоту в очереди, вы должны использовать qRegisterMetaType<T>()
, Просто вызовите его перед открытием сокета где-нибудь в конструкторе:
qRegisterMetaType<QAbstractSocket::SocketState>();
Предыдущий ответ (Неджата) хорош как прямой ответ о том, как в этом случае прикрепить сигнал к слоту. Но почему вы хотите запустить веб-сокет в дополнительном потоке? Я запускаю тот же Qt WebSocket из основного потока, и он не блокирует его. Время запуска такого типа сокетов само по себе ничтожно мало. Я предполагаю, что websocket использует некую блокировку ввода-вывода ОС (наиболее вероятно) или порождает другой поток внутри (менее вероятно). Помимо блокировки или выполнения массивных вычислений, у вас, вероятно, нет веских причин для создания нового потока, а затем позаботиться об управлении им и дополнительными коммуникационными издержками.
Мое предложение состояло бы в том, чтобы вести список открытых соединений веб-сокетов, и когда конкретное соединение получает запрос, порождает поток для его обработки и продолжает обрабатывать новые соединения / запросы в основном потоке. Затем, когда поток завершает обработку запроса, он сообщает основному потоку, что это сделано, вместе с ответом. Основной поток получит ответ от потока и отправит его через открытое соединение. Для этого вы можете использовать std :: async и std :: future.