2011-01-11 4 views
1

У меня есть NSTimer внутри пользовательского NSView. Таймер установлен всегда для повторения с определенным интервалом, и как только он срабатывает, таймер должен обновить кучу параметров представления.Как обеспечить, чтобы NSTimer всегда работал в NSView?

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

Мой вопрос: как я могу гарантировать, что таймер всегда срабатывает и обновляет параметры представления, даже если представление не в фокусе?

ответ

4

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

NSTimer *timer = [NSTimer timerWithTimeInterval:theInterval target:theTarget selector:theSelector userInfo:theUserInfo repeats:shouldRepeat]; 
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode]; 
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSEventTrackingRunLoopMode]; 
+0

Это было почти мое решение. Я фактически создал NSOperation, чтобы удерживать мои таймеры одновременно с основным потоком. – David

+0

EXC_BAD_ACCESS при использовании этого. – iamjustaprogrammer

0

один из возможных объяснений:

таймер сработает, и события добавляются в очередь вовремя. однако большая часть AppKit не является потокобезопасной, поэтому ... вы не видите обновление до следующей итерации цикла выполнения. iow, события блокируются, потому что все события проходят через основной цикл цикла/поток.

иметь смысл?

примечание: чтобы сделать проблемы еще более сложными, асинхронный чертеж является довольно новым для os x (на уровне NSView), поэтому убедитесь, что вы тестируете все основные версии ОС, которые вы собираетесь поддерживать. результаты/поведение будут различаться.

+0

Иногда вам нужно опуститься на нижние уровни графических библиотек и/или использовать асинхронный чертеж в своем пользовательском представлении, чтобы преодолеть это. – justin

+0

Я понимаю. Я поддерживаю только самую новую версию OSX. Так вы бы посоветовали открутить другой поток и нарисовать/обновить представление в отдельном потоке? – David

+0

ну, это моя первоначальная гипотеза - на самом деле это не может быть проблемой в вашем случае. это стоит доказать или опровергнуть, прежде чем переписывать ваш ui для правильной работы в контекстах mt. если это доказано, и вы абсолютно должны иметь эту функцию, то да, это маршрут, который я возьму. вы переопределите асинхронные методы 10.6 в NSView. конечно, все подпункты, оверлеи и супервизоры (если не непрозрачные) также должны быть способны визуализировать в этом контексте. в противном случае это выглядело бы плохо по другим причинам (при условии, что структура разрешила это, что возможно). mt рисунок может быстро стать сложным (продолжение) – justin

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