Python Tkinter mainloop увеличивает время обработки в многопоточном приложении - PullRequest
0 голосов
/ 31 мая 2018

В моем приложении у меня есть процесс, который выполняется в другом потоке, его выполнение занимает несколько секунд, и его нужно выполнить только один раз.У меня также есть окно загрузки, которое позволяет пользователям знать, что приложение все еще работает, и позволяет им отменить процесс.Это окно загрузки вызывает функцию каждые 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) решить эту проблему?

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...