c++ - 从另一个线程关闭 QTcpSocket

标签 c++ multithreading qt sockets networking

我在专用线程中使用 QTcpSocket。为了关闭这个线程,我有一个连接到 QTcpSocketdisconnected 信号的个人插槽。此插槽包含 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".

为什么?

感谢您的帮助。 ;)

最佳答案

好的,所以您可能需要稍微更改一下设计。不要只将套接字移动到新线程,而是让您的 NetworkObject 派生,然后移动它,并让套接字成为它的父级。我之前的答案修改没有工作,因为 close() 没有在 Qt 元系统中注册,因为它是一个普通的虚函数,而不是一个槽。使用新设计,您可以使用线程间信号和槽来解决问题。不同线程中对象之间的连接将自动解析为排队,并使用事件循环安排在正确的线程中执行。

此外,我注意到您在当前类中有一个插槽,但它不是 QObject 派生的。那行不通,您需要 Qt 的元系统才能有插槽。您不会收到错误,因为 slots 在 C++ 中编译为空,它仅由 MOC(元对象编译器)使用,因此您实际上没有插槽。

自然地,这意味着 QMetaObject::invokeMethod(yourNetworkClass, "disconnect", Qt::QueuedConnection) 现在也可以工作了。

关于c++ - 从另一个线程关闭 QTcpSocket,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32036234/

相关文章:

c++ - 将对基类的引用传递给 boost::thread,并调用派生类中的虚函数是否可行?

c++ - 为什么我的 OpenCL 3d 图像查找不起作用?

linux - 如何让多线程应用程序在 VMWare 下使用 Ubuntu 上的所有内核?

java - 同步中的等待和通知方法?

c++ - 在具有 constant_tsc 和 nonstop_tsc 的 cpu 上,为什么我的时间会漂移?

c++ - 使用 OpenGL 绘制多边形

python - 如何刷新 PyGTK 中的 DrawingArea?

c++ - opengl Framebuffer offscreen 到纹理,颜色错误

c++ - 如何在 QTextEdit 面板中附加选择查询结果?

c++ - 我如何从 QProcess 读取数据?