2014-02-17 2 views
2

Каков наилучший способ использования потоков в приложении GUI python, если приложение должно в какой-то момент прочитать большой файл? Вероятно, будет 2 потока, 1 для GUI, 1 для чтения файла. Должен ли я создавать потоки при запуске приложения или создать поток «чтение файла», когда он должен прочитать файл?Как создать потоки в приложении GUI python?

+1

Независимо от того, с кем вы больше всего уверены. Просто помните, что другие потоки не могут получить доступ к большинству графических интерфейсов. Попытка доступа к графическому интерфейсу из другого потока приведет к сбою графического интерфейса. Однако вы можете сделать это наоборот, графический интерфейс может легко получить доступ к любым данным в других потоках и использовать их до тех пор, пока вы обязательно заблокируете переменные и т. Д. – Torxed

ответ

1

Вопрос довольно расплывчатый, поскольку вы, вероятно, должны точно указать, в какую библиотеку gui вы ссылаетесь.

В большинстве графических интерфейсов я знаю, однако, что основной дизайн заключается в том, что только один поток (основной поток) должен иметь дело с графическим интерфейсом, и поэтому важно, чтобы другие потоки никогда не взаимодействовали напрямую с пользовательским интерфейсом. Единственное, что вам обычно разрешено делать из другого потока: post - сообщение для основного цикла GUI.

Если, например, вам нужен прогресс, откройте окно прогресса в основном потоке, запустите поток читателя, который продолжает отправлять сообщения по мере продолжения чтения, а затем окончательное сообщение после завершения процедуры. Любое взаимодействие с интерфейсом должно выполняться в основном потоке при обработке этих сообщений (асинхронных сообщений).

Если, например, вам необходимо реализовать также кнопку отмены, тогда основной поток должен просто установить переменную для рабочего потока, чтобы заметить (для простого назначения переменных в Python защита от мутекса не требуется, поскольку назначение является атомной операцией) ,

+0

Вы знаете, как создать поток по запросу (при необходимости) в python? – alwbtc

+0

@alwbtc: у Python есть низкоуровневый модуль «thread» или модуль более высокого уровня «threading». Для использования потока просто требуется 'thread.start_new_thread (read_function, (filename,))' где 'def read_function (filename): ...' будет выполняться в отдельном потоке. Для более сложных взаимодействий и если вам нужны мьютексы, то использование 'threading', вероятно, является лучшим путем. – 6502

Смежные вопросы