Создание QThread, содержащего соединение с сокетом в Python

1

В настоящее время я пытаюсь реализовать QThread, который содержит соединение сокета. Соединение сокета выполняется многократно (в то время как 1 :) проверка новых полученных данных. Как только эти данные будут получены, предполагается, что он должен отключить СИГНАЛ, вызывающий функцию, и подавать полученные данные.

Я получил соединение сокета. Когда я запускаю функцию самостоятельно, она ждет данных и печатает всякий раз, когда появляются новые данные. Однако, поскольку я пытаюсь создать графический интерфейс с Qt, я должен поместить это в свой собственный поток, чтобы он мог продолжать работать.

Поэтому для потоковой передачи я реализовал класс GenericThread, который принимает любую функцию и запускает ее внутри потока. Мой класс MainWindow соединяет сокеты SIGNAL, создает экземпляр GenericThread и запускает его. Это, однако, заставляет мое приложение зависать. Ниже приведены соответствующие фрагменты кода:

Соединительное соединение

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'

Я новичок в сокетах и потоках, поэтому я могу совершить очень тупую ошибку где-то.

  • 0
    Поток может быть уничтожен, если нет дальнейших ссылок на него. Попробуйте использовать self.thread intead для всего thread .
  • 0
    @alexisdm: Спасибо, похоже, это все исправлено. Хотя есть еще некоторые проблемы, но я думаю, что теперь я могу выяснить, что их вызывает.
Теги:
multithreading
qt
sockets
pyqt

1 ответ

3
Лучший ответ

Поток может быть уничтожен, если нет никакой дополнительной ссылки на него.

Попробуйте использовать self.thread а не только thread.

  • 0
    Я бы проголосовал за тебя, но, к сожалению, мне не хватает репутации. Сожалею.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню