Убедитесь, что QAbstractSocket::SocketState зарегистрирован с помощью qRegisterMetaType().

Я попытался поместить 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);

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

Любые идеи?


person Alfredo cubitos    schedule 15.09.2014    source источник


Ответы (3)


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

qRegisterMetaType<QAbstractSocket::SocketState>();
person Nejat    schedule 16.09.2014
comment
@Alfredocubitos, можно ли поделиться примером многопоточного веб-сокета. - person Vivian Lobo; 23.02.2019
comment
ой, простите. Это было слишком давно :-( - person Alfredo cubitos; 25.02.2019

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

person Alexander V    schedule 17.09.2014
comment
Голосую за это, потому что много раз первая реакция людей: я знаю, позвольте мне создать новую тему! когда это обычно ужасная идея. Особенно с управляемой событиями структурой, такой как Qt. - person ScottG; 25.09.2014

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

person Elkvis    schedule 17.12.2014
comment
Я знаю, что это старый пост, но не могли бы вы поделиться более подробной информацией о том, как это реализовать в деталях? Вы бы использовали QFuture? - person Danyright; 28.04.2017