C++ 如何在线程中关闭QWebSocket?

C++ 如何在线程中关闭QWebSocket?,c++,qt,qt5,qt-signals,C++,Qt,Qt5,Qt Signals,我将QWebSocket移动到线程,然后如何在主线程中关闭它 由于我将其移动到工作线程,所以无法直接从主线程调用close。它与此消息一起崩溃 QSocketNotifier:无法从其他线程启用或禁用套接字通知程序 如果不穿线,它工作得很好 这是我的密码。 有什么想法吗?非常感谢 \ifndef主窗口 #定义主窗口 #包括 #包括 #包括 名称空间用户界面{ 类主窗口; } 类主窗口:公共QMainWindow { Q_对象 公众: 显式主窗口(QWidget*parent=nullptr);

我将QWebSocket移动到线程,然后如何在主线程中关闭它

由于我将其移动到工作线程,所以无法直接从主线程调用close。它与此消息一起崩溃

QSocketNotifier:无法从其他线程启用或禁用套接字通知程序

如果不穿线,它工作得很好

这是我的密码。 有什么想法吗?非常感谢

\ifndef主窗口
#定义主窗口
#包括
#包括
#包括
名称空间用户界面{
类主窗口;
}
类主窗口:公共QMainWindow
{
Q_对象
公众:
显式主窗口(QWidget*parent=nullptr);
~main窗口();
专用插槽:
单击按钮时无效();
在“断开连接”按钮上无效单击();
void onClientConnected();
void onClientClosed();
void onclientextmsg(常量QString&msg);
私人:
Ui::MainWindow*Ui;
QWebSocket*mClient;
QThread mWorkerThread;
};
#endif//main窗口
#包括“MainWindow.h”
#包括“ui_main window.h”
主窗口::主窗口(QWidget*父窗口):
QMainWindow(父级),
ui(新ui::主窗口),
mClient(nullptr)
{
用户界面->设置用户界面(此);
mWorkerThread.start();
qRegisterMetaType();
}
MainWindow::~MainWindow()
{
删除用户界面;
}
void主窗口::在连接按钮上单击()
{
mClient=新的QWebSocket();
连接(mClient,&QWebSocket::connected,this,&MainWindow::onClientConnected,Qt::DirectConnection);
连接(mClient,&QWebSocket::disconnected,this,&MainWindow::onClientClosed,Qt::DirectConnection);
连接(mClient,&QWebSocket::textMessageReceived,this,&MainWindow::onClientTextMsg,Qt::DirectConnection);
mClient->open(QUrl(“ws://192.168.2.2:1936”);
mClient->moveToThread(&mWorkerThread);
}
void主窗口::在断开连接按钮上单击()
{
//修复我崩溃
//QSocketNotifier:无法从其他线程启用或禁用套接字通知程序
mClient->close();
}
void主窗口::onClientConnected(){
qDebug()使用:


谢谢,它可以工作。但我发现了一个新问题。在高延迟网络环境中,客户端似乎阻止了工作线程中的事件循环,可能吗?
close
方法不会调用util-all-msg-received。如何立即关闭客户端?最后,我在QT源代码
qwebsocketframe.pp
中找到了anwser。也许我应该更改此代码…```//TODO:waitForReadyRead确实应该更改//现在,当在GUI线程中使用WebSocket时//GUI最多会挂起5秒钟//也许,如果(!pIoDevice->waitForReadyRead(5000)){},应该使用QStateMachine```
QMetaObject::invokeMethod(mClient, "close", Qt::QueuedConnection);