在Python中生成包含套接字连接的QThread

2 投票
1 回答
1791 浏览
提问于 2025-04-17 00:49

我现在正在尝试实现一个包含套接字连接的QThread。这个套接字连接会不断运行(while 1:),检查是否有新的数据到来。一旦收到数据,它应该触发一个信号,调用一个函数,并把收到的数据传给这个函数。

我已经让套接字连接工作了。当我单独运行这个函数时,它会等待数据,并在有新数据到来时打印出来。不过,由于我想用Qt构建一个图形界面,所以我必须把这个放在一个单独的线程里,这样应用程序才能继续正常运行。

为了实现多线程,我创建了一个通用线程类,这个类可以接收任何函数并在一个线程中运行。我的MainWindow类连接了套接字的信号,实例化了一个通用线程,然后启动它。然而,这样做导致我的应用程序卡住了。下面是相关的代码片段:

套接字连接

def remoteConn(self, HOST='my.server', PORT=25562):
  import socket
  s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  s.connect((HOST, PORT))
  newLinesRaw = ''
  while 1:
    newData = s.recv(1024)
    if newData:
      print '<rawData>\n', newData, '\n</newData>\n'
      newLinesRaw += newData
    else:
      if newLinesRaw:
        newLines = newLinesRaw.split('\n')
        print '\nNew Lines:\n', newLines
        self.emit(QtCore.SIGNAL('newRemoteLines'), newLines)
        newLinesRaw=''
      else:
        time.sleep(.1)
  s.close()

通用线程类

class GenericThread(QtCore.QThread):
  def __init__(self, function, *args, **kwargs):
    QtCore.QThread.__init__(self)
    self.function = function
    self.args = args
    self.kwargs = kwargs

  def __del__(self):
    self.wait()

  def run(self):
    if self.args and self.kwargs:
      self.function(*self.args,**self.kwargs)
    elif self.args and not self.kwargs:
      self.function(*self.args)
    elif not self.args and self.kwargs:
      self.function(**self.kwargs)
    else:
      self.function()
    return

启动远程线程。注意两个打印语句都被执行了。

  print 'spawning remote thread'
  self.connect(self, QtCore.SIGNAL('newRemoteLines'), self.routeServerLines)
  thread = GenericThread(self.remoteConn)
  thread.start()
  print 'thread started'

我对套接字和线程还很陌生,所以可能在某个地方犯了很愚蠢的错误。

1 个回答

4

如果没有其他地方再提到这个线程,它可能会被销毁。

试着用 self.thread,而不是单纯用 thread

撰写回答