2012-04-08 3 views
1

Я создаю приложение в pygtk, которое включает в себя запуск бесконечного цикла. Я думаю, что цикл помешает witk gtk.main() и, следовательно, приложение не отвечает. На самом деле, я создаю серверное приложение, которое постоянно прослушивает клиентские подключения. Помощь Plzzz .... Я новичок в этом.Как запустить бесконечный цикл while в 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) 

Я thougth замены 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

На это нельзя ответить без отображения какого-либо кода. –

+0

@ EmilVikström: Обычно я согласен. Но я думаю, что в этом случае довольно хороший ответ все же можно дать, чтобы охватить общую проблему. – jdi

ответ

2

Вы можете заставить приложение для обработки событий в ожидании Gtk следующим образом:

while True: 
    #your code 

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

Однако, если «ваш код» требует времени для выполнения, вы должны рассмотреть возможность его реализации в фоновом режиме.

+1

Если в его коде используются блокирующие вызовы (содержимое сокетов), пользовательский интерфейс может по-прежнему не отвечать на запросы, то – katzenversteher

+0

И, скорее всего, сетевая библиотека будет иметь свой собственный цикл событий, который будет прослушивать подключения клиентов и блокировать их. – jdi

+0

Это всего лишь подсказка, если в гнезде для прослушивания нет таймаута, это не сработает. Как уже упоминалось, сообщение должно быть реализовано в другом потоке –

0

Даже не видя никакого кода, я уверен, что знаю, где этот вопрос идет. pygtk, вероятно, не отличается от других графических интерфейсов GUI, поскольку его основной цикл представляет собой цикл событий. Все виджеты в приложении регистрируют свои события в этом цикле, чтобы ваше приложение функционировало. В этих управляемых событиями графических интерфейсах вы никогда не должны блокировать основной поток. Все операции в основном потоке должны возвращаться относительно быстро.

Если вам нужно выполнить что-то, что собирается блокировать или выполнить большую обработку, эту функциональность следует перенести в отдельный поток. Это понадобится, если ваш сетевой цикл будет блокироваться навсегда в своем собственном цикле событий. Если это так, у вас не будет выбора, кроме как использовать поток.

Я не знаком с pygtk, но PyQt/PySide предоставляет функцию, которая позволяет вам рассказать цикл событий для обработки. Вы можете вставить это внутри цикла, который вы выполняете в своем основном потоке, чтобы периодически очищать события. Это будет альтернативой запуску вашего процесса в другом потоке. Но опять же, только если ваш другой код не блокируется и просто петли снова и снова.

1

Вы можете использовать второй поток (docs.python.org/library/threading.html). Существует также способ включить gtk в ваш цикл (используя pygtk.org/docs/pygtk/...), но, поскольку вы упоминаете о сети, я предполагаю, что вы используете блокирующие вызовы, которые также блокируют цикл до тех пор, пока в сети ничего не произойдет. Однако я могу только догадываться, пока вы не покажете нам какой-то фактический код.

Смежные вопросы