Mac OS X: что вызывает вращающийся пляжный мяч? - PullRequest
11 голосов
/ 18 января 2009

Когда OS X решит дать вашему приложению крутящийся пляжный мяч? Что вы можете сделать при программировании приложения, чтобы избежать этого?

Ответы [ 3 ]

20 голосов
/ 18 января 2009

Оконный сервер покажет курсор ожидания вращения, когда самое переднее приложение или приложение, у которого есть окно под указателем мыши, не ответило на события от оконного сервера в течение определенного времени.

Чтобы избежать вращающегося курсора ожидания, приложение должно своевременно обслуживать события. Нет никакого способа обойти это поведение сервера окон, и на то есть веская причина: никогда не предполагается, что приложения в Mac OS X не будут реагировать на действия пользователя.

7 голосов
/ 18 января 2009

Причина в том, что ваше приложение блокирует пользовательский интерфейс. Как говорили другие авторы, оконный менеджер может заметить, что вы некоторое время не обрабатывали события, и вывести этот пользовательский интерфейс.

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

Если вы не выполняете ввод-вывод, то вы, вероятно, находитесь в каком-то длинном цикле в потоке пользовательского интерфейса, из-за которого вы не отвечаете. В этом случае либо оптимизируйте, либо удалите цикл, либо переместите его в фоновый поток.

6 голосов
/ 18 января 2009

Предполагая, что ваше приложение имеет достаточные аппаратные ресурсы (что не всегда бывает в действительности), нет никаких причин, по которым ваше приложение должно когда-либо играть в пляжный мяч. Если это так, выясните, какая часть кода блокирует пользовательский интерфейс (если он не интуитивно понятен, Shark.app пригодится) и переместите его в фоновый поток (или используйте другую стратегию для устранения паузы). К счастью, у Cocoa и Objective-C есть довольно хорошие инструменты для многопоточности, для начала посмотрите NSOperationQueue. У Apple также есть несколько хороших документов по настройке производительности, см. этот вопрос для соответствующих ссылок.

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