Примечание: Обновление ниже ...Как я могу разрешить пользователю настраивать NSSlider без приостановки цикла обновления приложения?
У меня есть настольное приложение какао, которое состоит из ряда элементов управления вокруг пользовательских NSView. Я использую displayLink для управления обновлениями.
Когда пользователь нажимает на NSControl (слайдер, кнопка, флажок, радиокнопка), приложение оказывается замороженным до тех пор, пока мышь не будет отпущена. На самом деле я могу подтвердить, что обратный вызов displayLink (getFrameForTime) НЕ срабатывает в течение времени. Если я создаю таймер, который также не срабатывает, оба остаются приостановленными до тех пор, пока пользователь не освободит мышь, после чего приложение возобновит обновление.
Управление связано, и если я обновляю это значение из другого потока (например, через обратный вызов из MIDI-интерфейса), слайдер ведет себя так, как ожидалось: он перемещается, значение обновляется и приложение не приостанавливается.
Я чувствую, что это должно быть довольно очевидное решение, но я в тупике.
Проверка «непрерывный» в IB делает как рекламируется: посылает значения непрерывно, но по-прежнему демонстрирует такое поведение (предотвращает обновление пользовательского интерфейса), пока мышь не будет отпущен.
Это, по-видимому, связано конкретно с mouseDown on NSControl? Почему этот блок, и мне действительно нужно подклассифицировать все мои элементы пользовательского интерфейса, чтобы изменить это поведение (кажется экстремальным)
DisplayLink в своей нити, так почему mouseDown на основном потоке блокирует его? Если это так, то с учетом предписания об обновлении пользовательского интерфейса Cocoa из-за основного потока, как мне с ним справиться?
Любая помощь очень ценится.
Update
Per @ комментарии николаевские ниже, я могу подтвердить, что с помощью NSTimer и добавить его в NSEventTrackingRunLoopMode не блокирует. Тем не менее, я бы очень хотел использовать CVDisplayLink, который (согласно документации) работает в своем собственном потоке и не должен быть заблокирован таким образом. В отличие от CADisplayLink, я не могу найти способ явно назначить runloop CVDisplayLink (похоже, что это не работает), поэтому, возможно, новый вопрос должен быть:
Почему блок CVDisplayLink на NSEventTrackingRunLoopMode?
Можете ли вы опубликовать минимальный пример проекта, который демонстрирует описанное поведение? –
Несомненно, теперь это вместе ... – andrew
Хорошо, проект здесь. Обратите внимание, что это очень минимально, он ничего не отображает (смотрите консоль для NSLog с таймера и с displayLink). Также обратите внимание, что слайдер ни к чему не подключен и ничего не делает: https://dl.dropboxusercontent.com/u /930604/Personal/DisplayLinkIssue.zip – andrew