Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 30, 2011 20:15:13

plusplus
От:
Зарегистрирован: 2009-01-05
Сообщения: 418
Репутация: +  15  -
Профиль   Отправить e-mail  

PyQt. Пул потоков и Gui.

Кто-нибудь может объяснить как реализовать пул потоков? А именно, есть простое окно, на нём QtextEdit и кнопка старт. Есть 100 заданий, как только нажали кнопку старт стартует одновременно не более 15 потоков, каждый выполняет одно задание. Как только поток завершил работу это отображается в QtextEdit и сразу же стартует новый, и так - пока не будут выполнены все задания. Как это организовать? Я что-то пробовал сделать с QThreadPool и QRunnable, но у меня такая гадость вышла, что вылетает отчет об ошибке и программе прерывается. Помогите пожалуйста, уже заколебался, вроде бы задача то должна быть популярная, а нагуглить не могу.



Офлайн

#2 Авг. 30, 2011 22:05:05

truporez
От:
Зарегистрирован: 2009-05-08
Сообщения: 266
Репутация: +  6  -
Профиль   Адрес электронной почты  

PyQt. Пул потоков и Gui.

Вот тут dimabest архиполезный пример сваял.



Офлайн

#3 Авг. 31, 2011 07:58:22

plusplus
От:
Зарегистрирован: 2009-01-05
Сообщения: 418
Репутация: +  15  -
Профиль   Отправить e-mail  

PyQt. Пул потоков и Gui.

Спасибо, пока вроде работает. Не понял я только один момент. Вот таким образом я запускаю потоки:

        for account in self.accounts:
self.queue.put(account)
for x in xrange(config['threads']):
thread = Twitter(self.queue) # Twitter - это QThread у меня
self.connect(thread, SIGNAL('finished'), self.appendToLog)
thread.start()
time.sleep(0.1)
Почему, если я уберу задержку в одну десятую секунду, приложение сразу же крашится? Пишет QThread: Destroyed while thread is still running



Офлайн

#4 Авг. 31, 2011 18:12:20

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

PyQt. Пул потоков и Gui.

Сборщик мусора оперативно убивает объекты (thread), на которые никто не ссылается.
Сохраняй объекты потоков в список и все будет ок.

self.threads = []
for x in xrange(config['threads']):
thread = Twitter(self.queue) # Twitter - это QThread у меня
# сохраняем ссылку на объект потока
self.threads.append(thread)
self.connect(thread, SIGNAL('finished'), self.appendToLog)
thread.start()



Офлайн

#5 Сен. 2, 2011 10:04:02

plusplus
От:
Зарегистрирован: 2009-01-05
Сообщения: 418
Репутация: +  15  -
Профиль   Отправить e-mail  

PyQt. Пул потоков и Gui.

Спасибо, я просто забыл отписать, что разобрался уже, всё так и сделал.

Может у кого найдутся примеры с использованием QThreadPool и QRunnable? Я с них начинал, может как раз из-за сборщика мусора они и сыпались, но возвращаться пока к ним неохота=) Если есть готовый пример - было бы интересно.

И еще один вопрос. Я сейчас использую Queue и её метод join для того, чтобы узнать когда все потоки завершатся. А как бы я узнал это, если использовал бы только средства Qt?



Отредактировано (Сен. 2, 2011 10:07:23)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version