【发布时间】:2013-09-01 20:19:14
【问题描述】:
注意:以下更新...
我有一个可可桌面应用程序,它由一系列围绕自定义 NSView 的控件组成。我正在使用 displayLink 来推动更新。
当用户单击 NSControl(滑块、按钮、复选框、单选按钮)时,应用程序似乎会冻结,直到释放鼠标。事实上,我可以确认 displayLink 回调(getFrameForTime)在此期间没有触发。如果我创建一个计时器,它也不会触发,两者都会保持暂停状态,直到用户释放鼠标,此时应用程序会继续更新。
控件已绑定,如果我从另一个线程更新该值(例如,通过来自 MIDI 接口的回调),滑块会按预期运行:它移动,值更新并且应用程序不会暂停。
我觉得这应该是一个相当明显的解决方法,但我很难过。
在 IB 中检查“连续”会像宣传的那样:连续发送值,但在释放鼠标之前仍然表现出这种行为(阻止 UI 更新)。
这似乎与 NSControl 上的 mouseDown 相关?为什么会阻塞,我真的需要子类化我所有的 UI 元素来改变这种行为(似乎很极端)
DisplayLink 是在自己的线程中,那为什么mouseDown 在主线程上阻塞呢?如果是这种情况,鉴于禁止从主线程以外的地方更新 Cocoa UI,我该如何处理?
非常感谢任何帮助。
更新
根据下面@Nikolai 的 cmets,我可以确认使用 NSTimer 并将其添加到 NSEventTrackingRunLoopMode 不会阻塞。但是,我真的很想使用 CVDisplayLink (根据文档)在它自己的线程中运行并且不应该以这种方式被阻止。与 CADisplayLink 不同,我找不到将运行循环显式分配给 CVDisplayLink 的方法(似乎它不起作用),所以也许新问题应该是:
为什么 CVDisplayLink 在 NSEventTrackingRunLoopMode 上会阻塞?
【问题讨论】:
-
你能发布一个展示所描述行为的最小示例项目吗?
-
好的,现在把它放在一起......
-
好的,项目在这里。请注意,它确实非常小,它不显示任何内容(从计时器和 displayLink 观察 NSLog 的控制台)还请注意,滑块什么都不连接,什么也不做:dl.dropboxusercontent.com/u/930604/Personal/…
标签: objective-c multithreading macos cocoa