2016-06-08 59 views
0

我想做一個簡單的聊天應用程序與套接字,當我嘗試了一個簡單的事情,使一個循環,聽我的主機名和端口,GUI將開始凍結,並會根本沒有迴應。PyQt:窗口停止響應時,聽IP,端口

但是,我也試過QTimer(),因爲它是爲PyQt設計的,但它會帶來相同的結果並凍結窗口。

def startloop(self): 
    IP = socket.gethostbyname(socket.gethostname()) 
    self.s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
    self.s.bind((IP, 5005)) 
    self.loop = QtCore.QTimer(self) 
    self.loop.timeout.connect(self.check) 
    self.loop.start(10000) 

def recv(self): 
    data, addr = self.s.data.recvfrom(1024) 
    print data 

10秒(發生超時),它開始凍結該窗口後,可問題是什麼呢?我需要分離流程嗎?還有其他更好的解決方案嗎?

+1

UI和阻塞套接字通信不應該在同一個線程中。當套接字等待時,GUI也被阻止。嘗試使用另一個線程的套接字和通過信號/插槽與GUI溝通 – SnoozeTime

+0

謝謝@SnoozeTime但我不是很熟悉pyqtslot,我可以得到一個例子,我會怎麼做呢? – ShellRox

回答

0

你需要做的GUI和通信不同的線程。當套接字例如等待一些數據時,GUI被阻塞。您可以使用QT的信號/插槽連接兩個線程。

例如,示例是GUI的類。 MyThread將在另一個線程中運行,並每秒鐘調用一個示例插槽。 進口SYS 從PyQt4的進口QtGui,QtCore 進口時間 進口線程

class Example(QtGui.QWidget): 

    def __init__(self): 
     super(Example, self).__init__() 
     QtGui.QToolTip.setFont(QtGui.QFont('SansSerif', 10)) 
     btn = QtGui.QPushButton('Button', self) 
     self.show() 
     self.background = MyThread(self) 
     t = threading.Thread(target=self.background.process) 
     t.start() 
     self.background.notify.connect(self.notify) 

    @QtCore.pyqtSlot() 
    def notify(self): 
     print("I have been notified") 

class MyThread(QtCore.QObject): 

    notify = QtCore.pyqtSignal() 

    def __init__(self, parent): 
     super(MyThread, self).__init__(parent) 
     self.should_continue = True 

    def process(self): 
     while self.should_continue: 
      # Here, do your server stuff. 
      time.sleep(1) 
      self.notify.emit() 

def main(): 

    app = QtGui.QApplication(sys.argv) 
    ex = Example() 
    sys.exit(app.exec_()) 

if __name__ == '__main__': 
    main() 
上述

更多DOC ON信號/插槽http://pyqt.sourceforge.net/Docs/PyQt4/new_style_signals_slots.html

注意在這個例子中,你將需要MyThread.process功能在退出應用程序之前完成。這可以通過將should_continue變量設置爲false來完成。

+0

謝謝你,成功了! – ShellRox

1

最可能的問題是發生,因爲你只在主應用程序中連接套接字,而這正在拖延包括GUI在內的整個過程。 因此,解決方案最好是在單獨的進程中使用subprocess模塊和multiprocessing模塊運行套接字函數和聊天功能。

通過這些,你會從主GUI程序運行在不同的進程中sockect應用分開,兩者將並行地工作,而不會停止的主要應用

+0

我已經嘗試使用多處理庫進行多個進程,但似乎沒有工作。 'DEF開始(): \t應用程式= QtGui.QApplication(sys.argv中) \t GUI =窗口() \t sys.exit(app.exec_()) \t P1 =進程(目標= self.authcheck) \t p1.start() \t P2 =進程(目標= self.recv) \t p2.start() 的start() '它仍然是落後了 – ShellRox