我在专用线程中使用 QTcpSocket
。为了关闭这个线程,我有一个连接到 QTcpSocket
的 disconnected
信号的个人插槽。此插槽包含 socket.close()
指令。
class Network
{
private:
QTcpSocket *mp_Socket;
public:
void connection()
{
mp_Socket = new QTcpSocket(this);
// Move to thread
connect(mp_Socket, SIGNAL(disconnected()), this, SLOT(disconnect()));
}
public slots:
void disconnect()
{
mp_Socket->close();
}
};
在这里,插槽起作用了(即使套接字在另一个线程中)。 但是,如果我自己调用断开插槽,则会出现以下错误:
"QSocketNotifier: socket notifiers cannot be disabled from another thread".
为什么?
感谢您的帮助。 ;)
最佳答案
好的,所以您可能需要稍微更改一下设计。不要只将套接字移动到新线程,而是让您的 Network
类 Object
派生,然后移动它,并让套接字成为它的父级。我之前的答案修改没有工作,因为 close()
没有在 Qt 元系统中注册,因为它是一个普通的虚函数,而不是一个槽。使用新设计,您可以使用线程间信号和槽来解决问题。不同线程中对象之间的连接将自动解析为排队,并使用事件循环安排在正确的线程中执行。
此外,我注意到您在当前类中有一个插槽,但它不是 QObject
派生的。那行不通,您需要 Qt 的元系统才能有插槽。您不会收到错误,因为 slots
在 C++ 中编译为空,它仅由 MOC(元对象编译器)使用,因此您实际上没有插槽。
自然地,这意味着 QMetaObject::invokeMethod(yourNetworkClass, "disconnect", Qt::QueuedConnection)
现在也可以工作了。
关于c++ - 从另一个线程关闭 QTcpSocket,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32036234/