Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » GUI
  • » вопрос по GUI с многопоточностью [RSS Feed]

#1 Ноя. 28, 2010 19:35:53

Игнат
От:
Зарегистрирован: 2010-10-02
Сообщения: 224
Репутация: +  0  -
Профиль   Отправить e-mail  

вопрос по GUI с многопоточностью

питон 3.1, pyQt4
многопоточность “from futures import ThreadPoolExecutor”

собственно, я создал главный класс (например base), который создает GUI
он в свою очередь создает объект отдельного класса, к примеру Checker, цель которого - создать потоки для данных из ГУИ и раздать им задачи

возник вопрос, как лучше обращаться к ui?
- унаследовать Checker от base, чтобы в нем ГУИ был доступен через self.ui
- как-то использовать коннекты и слоты для связи между base и Checker, как делает мой друг в C++/Qt4 (с этим при необходимости разберусь)
- разместить функции работы с ui в base(который создал ГУИ) - а из Checkerа только их и вызывать, получая-отправляя простые данные

и ещё вопрос - используются ли в питоне ReadWriteLock/блокираторы/mutex, чтобы потоки не могли одновременно вызывать одни методы?



Офлайн

#2 Ноя. 28, 2010 20:07:20

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

вопрос по GUI с многопоточностью

Откровенно говоря - ничего не понял.



Офлайн

#3 Ноя. 28, 2010 21:04:58

Игнат
От:
Зарегистрирован: 2010-10-02
Сообщения: 224
Репутация: +  0  -
Профиль   Отправить e-mail  

вопрос по GUI с многопоточностью

составил схему


непонятно как правильно реализовать то, что написано синим цветом в checker.py и помечено вопросами
одно я точно усвоил - тело потока не должно напрямую обращаться к ГУИ, это должен делать основной поток


1 в плюсах используются mutex и некие локеры - которые не дают двум потокам запустить один и тот же метод основного потока одновременно (второй поток будет ждать пока первый не освободит этот метод) - есть и нужно ли подобное в питоне?

2 где лучше делать методы для работы с ГУИ (например получение всех данных и разбиение текста на строки, обновление счётчика) - в main.py (создавшем ГУИ и содержащем self.ui) или в checker.py?
(если в checker.py - как правильно передать в него доступ к ui? путем наследования Checker от Main?)


буду очень признателен, если поможете разобраться
я неспешно изучаю питон и хочу сразу идти наиболее правильным путем, а не методом проб и ошибок, которым я изучал пхп



Отредактировано (Ноя. 28, 2010 21:08:12)

Офлайн

#4 Ноя. 29, 2010 00:39:29

dimabest
От:
Зарегистрирован: 2009-02-12
Сообщения: 253
Репутация: +  0  -
Профиль   Отправить e-mail  

вопрос по GUI с многопоточностью

import Queue

class Worker(QThread):
def __init__(self, queue):
QThread.__init__(self)
self.queue = queue

def run(self):
while True:
task = self.queue.get()
result = task()
self.emit(SIGNAL('taskDone(PyQt_PyObject)'), result)



class Task(object):
def __init__(self, data):
self.data = data

def __call__(self):
# обрабатываем данные и возвращаем результат
return new_data

NUM_THREADS = 4

class Main(object):
def __init__(self):
# очередь для заданий
self.queue = Queue.Queue()
# создаем пул потоков
self.threads = []
for i in range(NUM_THREADS):
t = Worker(self.queue)
QObject.connect(t, SIGNAL('taskDone(PyQt_PyObject)'), self.task_done)
self.threads.append(t)
t.start()


def start(self):
# обращаемся к UI и забираем данные
array = self.getArrayOfData()
# в цикле создаем задания и добавляем в очередь
for data in array:
task = Task(data)
self.queue.put(task)

def task_done(self, result):
# данный метод будет вызван в главном потоке, поэтому
# можно без проблем обновлять UI
# писать в файлы также лучше здесь, ибо отпадает необходимость
# синхронизации потоков
pass



Офлайн

#5 Ноя. 29, 2010 15:08:00

Игнат
От:
Зарегистрирован: 2010-10-02
Сообщения: 224
Репутация: +  0  -
Профиль   Отправить e-mail  

вопрос по GUI с многопоточностью

благодарю



Офлайн

  • Начало
  • » GUI
  • » вопрос по GUI с многопоточностью[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version