1

我试图将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”类型的参数进行排队(确保使用 qRegisterMetaType() 注册了“QAbstractSocket::SocketState”。)

当我做

websocket.open(wsUrl);

没有线程连接工作正常。

有任何想法吗?

4

3 回答 3

2

如果你想通过排队的信号/槽连接发送你的对象,你应该使用qRegisterMetaType<T>(). 只需在构造函数中的某个位置打开套接字之前调用它:

qRegisterMetaType<QAbstractSocket::SocketState>();
于 2014-09-16T04:21:03.360 回答
2

在这种情况下,先前(Nejat 的)答案很好地直接回答了如何将信号附加到插槽。但是你为什么要在一个额外的线程上启动 web-socket 呢?我从主线程启动相同的 Qt WebSocket,它并没有阻塞它。启动这种类型的套接字本身的时间可以忽略不计。我猜 websocket 使用某种操作系统非阻塞 IO(最有可能)或在内部产生另一个线程(不太可能)。除了阻塞或进行大量计算之外,您可能没有充分的理由生成一个新线程,然后负责管理它和额外的通信开销。

于 2014-09-17T17:46:30.643 回答
1

我的建议是维护一个打开的 websocket 连接列表,当特定连接收到请求时,生成一个线程来处理请求并继续在主线程上处理新的连接/请求。然后,当线程完成处理请求时,它会向主线程发出它已完成的信号以及响应。然后主线程将接收来自线程的响应并通过打开的连接将其发送出去。您可以使用 std::async 和 std::future 来完成此操作。

于 2014-12-17T21:39:14.297 回答