2012-04-08 62 views
1

我正在pygtk中創建一個包含運行無限循環的應用程序。我認爲,循環會干擾gtk.main(),因此應用程序不會響應。實際上,我正在構建一個服務器類型的應用程序,它不斷監聽客戶端連接。Plzzz幫助....我是一個新手。如何在pygtk中運行無限循環?

這是我最初試圖做一個樣品(對於那些誰想要的代碼)

while 1: 
    s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) 
    s.bind(('',2727)) 
    s.listen(1) 
    c,d=s.accept() 
    print d 
    x=c.recv(1024) 

我的吼聲結束與替代gtk.main()的:

while 1: 
    s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) 
    s.bind(('',2727)) 
    s.listen(1) 
    s.accept() 
    gtk.main_iteration_do(False) 

它的工作,但s.accept()會導致同樣的問題,正如前面....誰能幫助

+1

沒有你顯示一些代碼,這是無法回答的。 – 2012-04-08 17:47:58

+0

@EmilVikström:通常我會同意。但我認爲在這種情況下,仍然可以給出一個相當好的答案來解決一般問題。 – jdi 2012-04-08 18:16:11

回答

2

您可以強制你的應用程序來處理未決的GTK活動方式如下:

while True: 
    #your code 

    while gtk.events_pending(): 
     gtk.main_iteration() 

但是,如果'你的代碼'需要一段時間才能執行,你應該考慮在後臺進程中實現它。

+1

如果他的代碼使用阻塞調用(套接字的東西),用戶界面可能仍然沒有響應,然後 – katzenversteher 2012-04-08 18:07:37

+0

更有可能的是,一個網絡庫將有自己的事件循環,將監聽客戶端連接,並阻止。 – jdi 2012-04-08 18:08:24

+0

這只是一個提示,如果在監聽套接字上沒有超時,這將不起作用。如前所述,通信應該在另一個線程中執行 – 2012-04-08 18:10:41

0

即使沒有看到任何代碼,我很確定我知道這個問題在哪裏。 pygtk可能與其他GUI框架沒有什麼不同,因爲它的主循環是一個事件循環。應用程序中的所有小部件都將其事件註冊到此循環中,以使您的應用程序正常工作在這些事件驅動的GUI框架中,你絕不應該阻塞主線程。主線程中的所有操作應該返回相對較快。

當您需要執行某些將要阻止或執行大量處理的內容時,應將此功能移至單獨的線程。如果你的網絡環路將在自己的事件循環中永遠阻塞,這將是必要的。如果是這種情況,您將無法選擇,只能使用線程。

我不是特別熟悉pygtk,但是PyQt/PySide提供了一個函數,讓你告訴事件循環進行處理。您可以將它放在您在主線程中執行的循環中,以定期刷新事件。這可以替代在另一個線程中運行你的進程。但是,只要你的其他代碼不阻塞,並且一遍又一遍地循環。

1

您可以使用第二個線程(docs.python.org/library/threading.html)。還有一種方法是在你的循環中加入gtk(通過使用pygtk.org/docs/pygtk/...),但是由於你提到了網絡,我猜你正在使用阻塞調用,阻塞環路直到網絡上發生某些事情。不過,我只能猜測,直到你向我們展示一些實際的代碼。