plusplus
Авг. 30, 2011 20:15:13
Кто-нибудь может объяснить как реализовать пул потоков? А именно, есть простое окно, на нём QtextEdit и кнопка старт. Есть 100 заданий, как только нажали кнопку старт стартует одновременно не более 15 потоков, каждый выполняет одно задание. Как только поток завершил работу это отображается в QtextEdit и сразу же стартует новый, и так - пока не будут выполнены все задания. Как это организовать? Я что-то пробовал сделать с QThreadPool и QRunnable, но у меня такая гадость вышла, что вылетает отчет об ошибке и программе прерывается. Помогите пожалуйста, уже заколебался, вроде бы задача то должна быть популярная, а нагуглить не могу.
plusplus
Авг. 31, 2011 07:58:22
Спасибо, пока вроде работает. Не понял я только один момент. Вот таким образом я запускаю потоки:
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
dimabest
Авг. 31, 2011 18:12:20
Сборщик мусора оперативно убивает объекты (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()
plusplus
Сен. 2, 2011 10:04:02
Спасибо, я просто забыл отписать, что разобрался уже, всё так и сделал.
Может у кого найдутся примеры с использованием QThreadPool и QRunnable? Я с них начинал, может как раз из-за сборщика мусора они и сыпались, но возвращаться пока к ним неохота=) Если есть готовый пример - было бы интересно.
И еще один вопрос. Я сейчас использую Queue и её метод join для того, чтобы узнать когда все потоки завершатся. А как бы я узнал это, если использовал бы только средства Qt?