我目前正在嘗試實現一個包含套接字連接的QThread。套接字連接重複運行(同時1 :)檢查收到的新數據。一旦接收到這些數據,它應該觸發一個調用函數的SIGNAL併爲其提供接收到的數據。在Python中產生一個包含套接字連接的QThread
我得到了套接字連接的工作。當我自己運行該函數時,它會等待數據並在新數據進入時進行打印。但是,由於我正在嘗試使用Qt構建GUI,因此必須將其放入其自己的線程中,以便應用程序繼續運行。
因此,爲了線程它,我實現了一個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'
我是新來的套接字和線程,因此我可以做的地方一個非常愚蠢的錯誤。
如果沒有進一步的引用,線程可能會被銷燬。嘗試使用'thread'的'self.thread' intead。 – alexisdm
@alexisdm:謝謝,這似乎解決了它。儘管仍然存在一些問題,但我想我現在可以找出造成它們的原因。 – jminardi