В моем приложении у меня есть процесс, который выполняется в другом потоке, его выполнение занимает несколько секунд, и его нужно выполнить только один раз.У меня также есть окно загрузки, которое позволяет пользователям знать, что приложение все еще работает, и позволяет им отменить процесс.Это окно загрузки вызывает функцию каждые 0,5 с для обновления сообщения: Обработка., Обработка .. или Обработка ... в цикле.
Проблема, с которой я столкнулся, заключается в том, что время загрузки значительно увеличивается с окном загрузки,Вот две разные реализации:
Без окна загрузки:
processing_thread.start()
processing_thread.join()
С окном загрузки:
processing_thread.start()
loading_window = LoadingWindow()
while processing_thread.is_alive():
try:
loading_window.window.update_idletasks()
loading_window.window.update()
except TclError:
return
Обратите внимание, что я не использую mainloop
, ноЭквивалентная реализация, которая позволяет мне проверить, работает ли мой процесс - немного похоже на join
и mainloop
, объединенные вместе ( Tkinter понимание mainloop ).Я также протестировал его с помощью mainloop (), и он все еще не уменьшал время обработки.
На данный момент, быстрое решение состояло в том, чтобы замедлить цикл и добавить больше времени простоя в основной поток:
processing_thread.start()
loading_window = LoadingWindow()
while processing_thread.is_alive():
try:
loading_window.window.update_idletasks()
loading_window.window.update()
time.sleep(0.5)
except TclError:
return
Это уменьшило время до чего-то похожего на то, что у меня без окна загрузки, но принесло мне 2 проблемы (насколько я мог видеть):
- Ответвремя медленнее (в худшем случае 0,5 с)
- Приложение завершится через некоторое время после завершения процесса (в худшем случае 0,5 с)
Есть ли способ реализовать это без этих недостатков?Будет ли многопроцессорная обработка (https://docs.python.org/3/library/multiprocessing.html#module-multiprocessing) решить эту проблему?
Спасибо