@potapovdmtriy

Почему замерает окно приложения PyQt5?

for link in self.all_links:
    tr = threading.Thread(target=self.sucess_send_request, args=(link, valid_proxy))
    tr.start()
    tr.join()

Без tr.join работает как положено, но мне нужно дождаться завершения всех потоков.
  • Вопрос задан
  • 117 просмотров
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
Потому что join() останавливает поток выполнения - в твоем случае поток GUI, который отвечает за работу окна приложения - пока целевой поток не завершится. Т.е. что ты делаешь - это эквивалент как если бы ты просто вызвал self.sucess_send_request(link, valid_proxy) прямо в обработчике события.

Нужно дождаться завершения к какому моменту? К моменту закрытия окна? Или ещё к какому?
Я бы сделал так: создай глобальные объекты (например, поля класса), доступные всем потокам. Один - типа threading.Lock, один - счётчик и один - типа threading.Event().
Когда поток запускается, он захватывает Lock, увеличивает счётчик и сбрасывает Event (метод clear()), отпускает Lock.
Когда поток готов завершиться, он захватывает Lock, уменьшает счётчик. Если после уменьшения счётчик стал равен 0, устанавливает Event (метод set()). Затем отпускает Lock. Убедись, что это происходит внутри try: finally:, чтобы непойманное исключение не сломало систему.

Тогда главный поток приложения может просто время от времени проверять текущее значение счётчика (число активных потоков). А если надо, то может ждать на объекте Event, чтобы дождаться завершения всех потоков.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
HemulGM
@HemulGM
Delphi Developer, сис. админ
Ну так ты и ждёшь все потоки...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы