2011-08-31 22 views
1

我目前正在嘗試實現一個包含套接字連接的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' 

我是新來的套接字和線程,因此我可以做的地方一個非常愚蠢的錯誤。

+0

如果沒有進一步的引用,線程可能會被銷燬。嘗試使用'thread'的'self.thread' intead。 – alexisdm

+0

@alexisdm:謝謝,這似乎解決了它。儘管仍然存在一些問題,但我想我現在可以找出造成它們的原因。 – jminardi

回答

3

如果沒有進一步的引用,線程可能會被銷燬。

嘗試使用self.thread而不僅僅是thread

+0

我會加油,但可惜我沒有足夠的聲望。抱歉。 – jminardi