При программировании GUI, возможно ли, чтобы цикл работал в фоновом режиме все время? - PullRequest
3 голосов
/ 18 мая 2011

Я сам обучаю себя некоторому ООП на python, и я создал простой графический интерфейс, который запускает несколько сценариев в фоновом режиме, используя Popen. Мне нужно постоянно определять, активны ли эти сценарии или нет, для чего я собирался использовать цикл.

Но как сделать так, чтобы цикл постоянно работал в фоновом режиме, не нарушая возможности пользователя использовать графический интерфейс?

Ответы [ 3 ]

5 голосов
/ 18 мая 2011

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

Посмотрите дальше на Google Threading в Python, но вот несколько ссылок: http://www.prasannatech.net/2008/08/introduction-to-thread-programming.html http://www.wellho.net/solutions/python-python-threads-a-first-example.html http://www.devshed.com/c/a/Python/Basic-Threading-in-Python/

Удачи

3 голосов
/ 18 мая 2011

Чтобы ваша программа делала более чем одну вещь одновременно, используйте модуль threading. Для связи между потоками используйте модуль queue. Но сначала Google "Python Threading Tutorial", чтобы вы могли понять, как работают потоки.

2 голосов
/ 18 мая 2011

Имейте в виду, что python не поддерживает многопоточность выполнения.Когда Python работает, только 1 поток работает в любой момент времени.Тем не менее, вы все равно должны убедиться, что ваши данные защищены от множественного доступа (то есть один поток начинает что-то делать, выполняет прерывание, другой поток начинает выполняться и начинает делать что-то еще, веселье наступает)

Когдапрограммируя в графическом интерфейсе, вы не должны (и пробалби не будет, так как это часто приводит к сбоям) манипулировать вашими виджетами из более чем одного потока.Большинство графических интерфейсов предоставляют средства для публикации «задач» в потоке, на котором выполняется графический интерфейс). Это может быть утомительно, но это единственный способ, которым он будет работать.Например: wxPython предоставляет функцию wx.CallAfter .

Насколько это возможно, попытайтесь выделить ваши блокировки (чтобы потоки не касались общих данных нав то же время) и объекты условий (которые используются для сигнализации одному потоку о переходе к чему-либо из другого потока) в вашем конструкторе (ах) ДО того, как вы запустите свои потоки:* И будьте готовы увидеть эту конструкцию много:

 def myMethod(self):
    self._lock.acquire()
    try:    # or with if you prefer
       # do my stuff
       # pack up my data
       def myFunc():
          # post updates to widgets

    finally:
       self._lock.release()

       wx.CallAfter(myFunc)
...