В настоящее время я пытаюсь реализовать 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'
Я новичок в сокетах и потоках, поэтому я могу совершить очень тупую ошибку где-то.
Поток может быть уничтожен, если нет никакой дополнительной ссылки на него.
Попробуйте использовать self.thread
а не только thread
.
self.thread
intead для всегоthread
.