Найти - Пользователи
Полная версия: [PyQt] правильно организовать взаимодйствие потоков
Начало » GUI » [PyQt] правильно организовать взаимодйствие потоков
1
mironich
Есть 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() #И тут же его возбуждаем ...
         
Как правильно сделать все вышеописанное? Без костылей..
reclosedev
Не понял зачем для аутентификации отдельный поток. Я бы сделал метод, get_auth_info() в котором происходила аутентификация и кешировался результат. Этот метод могли бы вызывать конкретные воркеры, все равно они в потоках, можно и блокировать один раз. Ну а сигналы использовал бы для отображения статуса/прогресса.

А вместо создания сигнала self.start_thread - каждый раз бы создавал поток через start(). Или соединял клик с методами наследника QObject, которого перенес в поток (moveToThread()).
mironich
Не понял зачем для аутентификации отдельный поток.
Работа идет через блокирующий http класс, поэтому в отдельный поток.
Хотя о том что вызывать надо через поток да не подумал..
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