Я разрабатываю библиотеку C++, где у нас есть модуль для обработки файловой системы и, в частности, обратные вызовы для изменений файлов. Я реализовал обратный вызов fsevent (как описано в https://developer.apple.com/library/mac/documentation/Darwin/Reference/FSEvents_Ref/Reference/reference.html и примере FSEvents C++).
Проблема в том, что я не получаю никаких обратных вызовов, если я не вызываю CFRunLoopRun()
после FSEventStreamStart(stream)
который блокирует основной поток. Если я использую тот же код в контексте GLFW без CFRunLoopRun()
я получаю обратные вызовы, и все работает нормально (неблокируется).
Я прошел через много кода GLFW и внедрил опрос Objective-C NSEvent, который GLFW делает в своей функции glfwPollEvents()
, к сожалению, событие glfwPollEvents()
равно нулю при каждом вызове, и вызываемые вызовы не вызываются.
Фрагмент GLFW от cocoa_window.m:
for (;;)
{
NSEvent* event = [NSApp nextEventMatchingMask:NSAnyEventMask
untilDate:[NSDate distantPast]
inMode:NSDefaultRunLoopMode
dequeue:YES];
if (event == nil)
break;
[NSApp sendEvent:event];
}
Любые идеи о том, как получить обратные вызовы (даже если я должен опросить их) без необходимости запуска контекста GLFW?
Обновить:
Мне хотелось бы получить обратные вызовы асинхронно, но я обнаружил, что FSEventStreamFlushSync
заставляет обратный вызов (если он есть) для вызова (и он работает!). Сначала я попробовал версию Async, которая не сработала.
Решение заключалось в использовании FSEventStreamFlushSync
который FSEventStreamFlushSync
обратные вызовы без контекста GLFW.
FSEventStreamScheduleWithRunLoop
для планированияCFRunLoopGetCurrent
. все это в теме, которую вы связали.CFRunLoopGetMain
.