2013-04-09 19 views
3

我使用PySide和這個IRC庫(https://bitbucket.org/jaraco/irc)在Python中製作GUI IRC客戶端。 PySide有一個處理GUI事件的主循環。 IRC庫也有一個循環來處理IRC事件。兩個循環在被調用後阻塞。我該怎麼辦?它只是在不同的線程中運行它們嗎?如何有兩個事件循環?

+1

是的,你必須在不同的線程中運行它們。 – 2013-04-09 16:58:40

+0

您的一個或兩個事件循環API可能有一個可供選擇的接口,您可以使用它來顯式輪詢事件。然後,您可以根據需要讓一個循環輪詢其他事件。您可能需要在計時器上完成此操作,因此一個庫的長時間無事件延伸不會爲另一個庫增加太多延遲。我不太瞭解PySide或者你的IRC庫以提供任何細節,但是值得檢查。 – Blckknght 2013-04-09 17:13:22

回答

1

IRC客戶端類支持通過on_connecton_disconnecton_schedule參數外部主循環集成。在PySide你可以使用這些來創建一個QSocketNotifier,摧毀它,並設置分別QTimer

class PySideIRCClient(IRC): 
    def __init__(self): 
     self.socket_notifiers = {} 
     return IRC(self.on_connect, self.on_disconnect, self.on_schedule) 

    def on_connect(self, socket): 
     notifier = QtCore.QSocketNotifier(socket, QtCore.QSocketNotifier.Read) 
     notifier.activated.connect(self.socket_activated) 
     self.socket_notifiers[socket] = notifier 

    def socket_activated(self, socket): 
     self.process_data([socket]) 

    def on_disconnect(self, socket): 
     self.socket_notifiers[socket].setEnabled(False) 
     del self.socket_notifiers[socket] 

    def on_schedule(self, seconds): 
     QtCore.QTimer.singleShot(seconds * 1000, self.process_timeout) 

PySideIRCClient然後用PySide Qt的事件循環集成,所以你可以只使用QtGui.QApplication.exec_()

+0

如果我的主應用程序是從'QtGui.QApplication'派生的,那麼我怎樣才能將'PySideIRCClient'與我的應用程序整合呢? – Jellyflower 2013-04-09 19:45:42

+1

@Jellyflower就像通常一樣使用'myApp.exec _()'; 'QtCore.QSocketNotifier'集成了幕後的Qt主循環。 – ecatmur 2013-04-10 07:49:45

0

來自該客戶端的IRCServer是來自TCPServer的衍生類,它是提供啓動循環的serve_forever方法的衍生類。還有一種替代方法,即handle_request,它可以處理單個請求(如果有的話)。

serve_forever基本上這樣做,在一個循環(它實際上調用較低級別的方法)。您可以設置QTimer來輪詢IRCserver,例如。每0.5秒(默認值爲serve_forever)。設置服務器的超時時間爲0,以避免結束鎖定並完成。