【问题标题】:QWebSocketServer to different threadQWebSocketServer 到不同的线程
【发布时间】:2017-04-17 04:17:45
【问题描述】:

我有一个应用程序,我应该使用 QWebSocketServer 来接受和解析来自 Bokeh 应用程序的一些套接字消息。到目前为止我能够做到这一点,但现在我想将整个 QWebSocketServer 移动到另一个线程中,这样它就不会打扰主 GUI。主要问题是 QWebSocketServer 是否会影响 GUI?

GUI 是 QWebSocketServer 的父级,我无法将其移动到另一个线程。如果我继承 QThread 类,这会起作用吗?

我知道我不应该继承 QThread 类和重载运行方法。我只是想知道这是否可能。

仅供参考:我在 Raspberry pi 中完成所有这些工作,而 raspberry pi 必须收集大量数据。

【问题讨论】:

  • Web 套接字是异步操作的,那么为此使用线程有什么意义呢?对我来说,这听起来像是过早的优化。这会在 GUI 中造成什么特定问题?
  • 此时它不会造成任何问题,因为GUI在这个阶段很小,但在后期它会变得相当大。我只是想知道是否可以将服务器移动到另一个线程。
  • 但何必呢?它会解决什么实际问题?
  • 嗯,如果 Websocket 连接出错或有大量信息要通过 websocket 发送,则 GUI 不会无响应。它真的会影响 GUI 吗?
  • 这是网络IO,是异步的。你为什么不正确地测试一下,看看实际发生了什么?

标签: qt user-interface websocket pyqt qthread


【解决方案1】:

我初始化了没有父级的 QWebSocketServer 并将其移动到另一个线程并且它工作。我不知道我做得对不对。

我是这样做的:-

    self.server = SocketServer()
    self.serverThread = QThread()
    self.server.moveToThread(self.serverThread)

这里的 SocketServer 是继承 QObject() 的服务器类,QWebSocketServer 在其中定义,没有任何父级。

这是SocketServer类的简短sn-p:-

    onMessageRecieved = pyqtSignal(str)
    serverObject = QWebSocketServer("My Server",QWebSocketServer.NonSecureMode)
    def __init__(self,parent=None):
        super().__init__(parent)
        self.server = QWebSocketServer(self.serverObject.serverName(),self.serverObject.secureMode(),parent)

别忘了启动线程。

【讨论】:

  • 看起来是正确的。你的问题是有父母。您不能将对象移动到与其父对象运行的线程不同的线程。 IE。您只能将对象移动到没有父级的其他线程。
  • 但是,当然,正如问题的 cmets 所指出的,如果您希望您的程序难以调试并且比必要的更复杂,那么这确实是必要的。两者通常都是非常糟糕的原因
  • 是的,如果我们有更多线程,处理器会花费大部分时间来切换线程。相反,我只是遵循一些遵循的范例,将 GUI 和其他操作分开以分开线程。
  • 只是为了确定:您知道 Web 套接字服务器与任何数据无关,对吧?它只是接受客户端连接,然后由 Web 套接字对象处理
  • 是的,我明白了,所有的数据推送或接收都是由 websocket 完成的,这个服务器只接受来自特定 IP 地址的特定端口的客户端连接。
猜你喜欢
  • 2016-09-14
  • 1970-01-01
  • 1970-01-01
  • 2011-05-18
  • 2021-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多