Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中生成包含套接字连接的QThread_Python_Multithreading_Qt_Sockets_Pyqt - Fatal编程技术网

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

在python中生成包含套接字连接的QThread,python,multithreading,qt,sockets,pyqt,Python,Multithreading,Qt,Sockets,Pyqt,我目前正在尝试实现一个包含套接字连接的QThread。套接字连接重复运行(1:)以检查接收到的新数据。一旦接收到该数据,它就应该发出一个调用函数的信号,并将接收到的数据提供给函数 我把插座连接好了。当我单独运行函数时,它会等待数据并在新数据到来时打印。然而,因为我试图用Qt构建一个GUI,所以我必须把它放在自己的线程中,这样应用程序才能继续运行 所以为了使它线程化,我实现了一个GenericThread类,它接受任何函数并在线程内运行它。我的MainWindow类连接套接字信号,实例化一个Gen

我目前正在尝试实现一个包含套接字连接的QThread。套接字连接重复运行(1:)以检查接收到的新数据。一旦接收到该数据,它就应该发出一个调用函数的信号,并将接收到的数据提供给函数

我把插座连接好了。当我单独运行函数时,它会等待数据并在新数据到来时打印。然而,因为我试图用Qt构建一个GUI,所以我必须把它放在自己的线程中,这样应用程序才能继续运行

所以为了使它线程化,我实现了一个GenericThread类,它接受任何函数并在线程内运行它。我的MainWindow类连接套接字信号,实例化一个GenericThread,然后启动它。但这会导致我的应用程序挂起。以下是相关代码:

插座连接

生成远程线程。请注意,两个print语句都被执行


我不熟悉套接字和线程,所以我可能在某个地方犯了一个非常愚蠢的错误。

如果没有进一步的参考,线程可能会被破坏


尝试使用
self.thread
而不仅仅是
thread

如果没有进一步的引用,线程可能会被销毁。尝试使用
self.thread
intead of just
thread
@alexisdm:谢谢,这似乎可以解决问题。虽然仍然存在一些问题,但我想我现在可以找到导致这些问题的原因。
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'