Найти - Пользователи
Полная версия: вопрос по GUI с многопоточностью
Начало » GUI » вопрос по GUI с многопоточностью
1
Игнат
питон 3.1, pyQt4
многопоточность “from futures import ThreadPoolExecutor”

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

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

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


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


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

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


буду очень признателен, если поможете разобраться
я неспешно изучаю питон и хочу сразу идти наиболее правильным путем, а не методом проб и ошибок, которым я изучал пхп
dimabest
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
Игнат
благодарю
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB