0

我正在开发一个 C++ 库,其中我们有一个用于文件系统处理的模块,特别是用于文件更改的回调。我已经实现了 fsevent 回调(如https://developer.apple.com/library/mac/documentation/Darwin/Reference/FSEvents_Ref/Reference/reference.htmlFSEvents 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强制回调(如果有的话)被调用(并且它有效!)。我首先尝试了异步版本,但它不起作用。

4

1 回答 1

2

FSEventStreamFlushSync解决方案是在没有 GLFW 上下文的情况下使用强制回调。

于 2014-10-16T12:08:21.840 回答