我正在开发一个 C++ 库,其中我们有一个用于文件系统处理的模块,特别是用于文件更改的回调。我已经实现了 fsevent 回调(如https://developer.apple.com/library/mac/documentation/Darwin/Reference/FSEvents_Ref/Reference/reference.html和FSEvents C++ 示例中所述)。
问题是我没有得到任何回调,除非我调用CFRunLoopRun()
之后FSEventStreamStart(stream)
阻塞主线程。如果我在 GLFW 上下文中使用相同的代码而没有CFRunLoopRun()
得到回调并且一切正常(非阻塞)。
我已经浏览了很多 GLFW 代码并实现了 GLFW 在其glfwPollEvents()
函数中执行的 Objective-C NSEvent 轮询,不幸的是,每次调用事件时事件都是 nil 并且没有调用回调。
来自 cocoa_window.m 的 GLFW 片段:
for (;;)
{
NSEvent* event = [NSApp nextEventMatchingMask:NSAnyEventMask
untilDate:[NSDate distantPast]
inMode:NSDefaultRunLoopMode
dequeue:YES];
if (event == nil)
break;
[NSApp sendEvent:event];
}
关于如何在不必运行 GLFW 上下文的情况下获取回调(即使我必须轮询它们)的任何想法?
更新:
我想异步获取回调,但我发现FSEventStreamFlushSync
强制回调(如果有的话)被调用(并且它有效!)。我首先尝试了异步版本,但它不起作用。