Как я могу программно определить, что приложение для Mac имеет "beachballed"? - PullRequest
2 голосов
/ 24 декабря 2009

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

Ответы [ 2 ]

5 голосов
/ 24 декабря 2009

Боюсь, я не знаю, какие именно классы или функции задействованы, но я могу дать вам общее представление о процессе.

Во-первых, следует понимать, что каждое приложение (возможно, каждое окно) имеет очередь событий, поддерживающую его. Каждый из них обслуживается потоком, который просто извлекает событие * из очереди, выполняет некоторую обработку, а затем возвращается к ожиданию следующего события. «Пляжный мяч» появляется (когда система вынуждена), когда очередь событий не обслуживается достаточно быстро. «Замороженная» очередь событий подразумевает, что приложение заблокировано при ответе на какое-либо событие в прошлом.

Теперь - вне контекста отладки - вы не сможете получить доступ к другому приложению и возиться с очередью событий потока, чтобы увидеть, обслуживается ли он. Но вместо этого вы можете периодически публиковать событие, которое будет запрещать ответ, и если этот ответ не приходит, вы знаете, что приложение «заблокировано».

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

* События - это такие вещи, как нажатие клавиши, нажатие клавиши вверх, перемещение мыши, перекраска и т. Д.

1 голос
/ 25 декабря 2009

Помимо самого WindowServer, другие известные мне системные компоненты, которые могут обнаруживать безответность, - это диалоговое окно принудительного выхода, spindump (который собирает профили выборки приложений, когда они не отвечают) и Activity Monitor (предположительно, через свой привилегированный подпроцесс pmTool. ). Возможно, запуск strings на pmTool может дать подсказки о том, какие системные вызовы использовать?

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

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