Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » GUI
  • » [PyQt] правильно организовать взаимодйствие потоков [RSS Feed]

#1 Дек. 24, 2012 18:30:10

mironich
От:
Зарегистрирован: 2011-05-23
Сообщения: 118
Репутация: +  2  -
Профиль   Отправить e-mail  

[PyQt] правильно организовать взаимодйствие потоков

Есть GUI приложение для работы с VK API, в нем 2 потока(у каждого свои задачи) занимаються конкретно работой с API, 1 поток авторизацией(дабы не пихать ее в каждый поток).
И того, GUI поток пораждает 3 потока: Auth, Grab, Upload/
Класс Auth имеет сигнал AuthOk который возникает в случае успешной авторизации.
Теперь о проблеблеме:
При старте одного из потоков(Grab, Upload) им нужны данные для доступа ВК.(кукисы, access токен), по нажатию кнопки вызываеться метод Auth потока, который в случае успеха возбуждает сигнал AuthOk.
Сейчас используеться крайне коствльное решение для того чтобы ы слотек который вызываеться AuthOk были установлены данные для авторизации нужному потоку, и он был запущен\вызван нужный метод.
Сначала по нажатию кнопки старт, вызываеться метод который в GUI потоке устанавливает аттрибуту thr_to_start константу которая оозначает какой из потоков нуждаеться в данных для авторизации.
Дальше жуже в слоте приемнике сигнала AuthOk.
Происходит такой быдлокод:

if  self.thr_to_start == ALBUM_THREAD:
    self.albums.vk.assign(self.auth.vk) #Присваиваем обьекту данные для авторизаци      
    self.start_thread.connect(self.albums.parse_albums) #Ужс! Подкл специальный сигнал для запуска метода к нужному методу потока
   self.start_thread.emit() #И тут же его возбуждаем ...
         
Как правильно сделать все вышеописанное? Без костылей..



Офлайн

#2 Дек. 24, 2012 20:25:47

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

[PyQt] правильно организовать взаимодйствие потоков

Не понял зачем для аутентификации отдельный поток. Я бы сделал метод, get_auth_info() в котором происходила аутентификация и кешировался результат. Этот метод могли бы вызывать конкретные воркеры, все равно они в потоках, можно и блокировать один раз. Ну а сигналы использовал бы для отображения статуса/прогресса.

А вместо создания сигнала self.start_thread - каждый раз бы создавал поток через start(). Или соединял клик с методами наследника QObject, которого перенес в поток (moveToThread()).

Офлайн

#3 Дек. 24, 2012 20:30:35

mironich
От:
Зарегистрирован: 2011-05-23
Сообщения: 118
Репутация: +  2  -
Профиль   Отправить e-mail  

[PyQt] правильно организовать взаимодйствие потоков

Не понял зачем для аутентификации отдельный поток.
Работа идет через блокирующий http класс, поэтому в отдельный поток.
Хотя о том что вызывать надо через поток да не подумал..



Офлайн

  • Начало
  • » GUI
  • » [PyQt] правильно организовать взаимодйствие потоков[RSS Feed]

Board footer

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

Powered by DjangoBB

Lo-Fi Version