мое приложение Mac OS X не отвечает, хотя я использую nsoperations и установил для maxConcurrentOperationCount значение 3 - PullRequest
0 голосов
/ 14 февраля 2011

Я давно смотрю на переполнение стека, но у меня никогда не было шанса ответить на мой первый вопрос, поэтому вот оно:

Я занимаюсь разработкой приложения для Mac OS X и использую nsoperations, чтобы приложение реагировало, я также установил maxConcurrentOperationCount равным 3, однако приложение все еще несколько не отвечает, выполняя свою работу, если оно пытается переместить окно, я вижу, что оно начинает отставать и ведет себя беспорядочно

Может кто-нибудь дать какие-либо подсказки или указатель на решение? (нет, не спрашивая образец кода;)

Ответы [ 3 ]

2 голосов
/ 14 февраля 2011

Существует несколько причин, по которым приложение может не отвечать на запросы в такой ситуации:

  • вы прямо блокируете цикл основного события или заполняете его событиями

  • у вас есть сложные операции рисования в главном потоке

  • ваше приложение использует так много памяти, что оно вызывает страницу системы.На самом деле не имеет значения, если у вас есть 10 потоков или 1 поток, как только вы начинаете пейджинг, ваша производительность падает вниз по трубам.поток (ы) / очередь (и)

Instruments предлагает ряд инструментов для профилирования использования процессора.Первое, что я хотел бы сделать, это выяснить, если основной поток использует много ресурсов ЦП (и если да, то для чего?) Или если он заблокирован в ожидании блокировок или тому подобного.

1 голос
/ 14 февраля 2011

Простое использование NSOperations не сделает приложение отзывчивым. Ключ к отзывчивости заключается в том, чтобы не блокировать основной поток. Если ваше приложение отстает, оно (обычно - см. Ответ @ bbum), потому что вы делаете что-то или что-то, что блокирует основной поток.

Способ узнать, что такое инструменты. Используйте инструмент Time Profiler, а затем посмотрите, что работает в главном потоке. Сделайте эти вещи меньше, перенесите их в операции, отложите их выполнение или какую-то их комбинацию. Если вам нужен рефакторинг, сделайте это.

Одна из возможностей состоит в том, что вы выполняете свои операции в основной очереди . Не делайте этого - они будут работать последовательно (независимо от maxOperationCount) в главном потоке. Создайте очередь и используйте созданную вами очередь.

1 голос
/ 14 февраля 2011

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

...