macos — потерян указатель контекста в обратном вызове FSEventStreamCreate (c ++)

Я пытаюсь протестировать простой FileWatcher в Mac, используя FSEvent Api.
Я получаю обратный вызов с событиями, и все, кажется, работает, но я не могу восстановить информацию, содержащуюся в информационном поле структуры контекста. Вот мой код:

void feCallback(ConstFSEventStreamRef streamRef,
void* pClientCallBackInfo,
size_t numEvents,
void* pEventPaths,
const FSEventStreamEventFlags eventFlags[],
const FSEventStreamEventId eventIds[]);

Watcher::Watcher(const QString& pathToFolder) :
folderPath_(pathToFolder)
{
CFStringCreateWithCString(kCFAllocatorDefault,path,kCFStringEncodingUTF8);
NSString *directory = [[NSString stringWithUTF8String:folderPath_.toStdString().c_str()] stringByDeletingLastPathComponent];
NSArray *pathToWatch = [NSArray arrayWithObjects:directory, nil];
FSEventStreamContext context = {0, (void*)this, NULL, NULL, NULL}; //the second parameter is the 'user info' field

CFAbsoluteTime latency = 3.0;
FSEventStreamRef stream;
stream = FSEventStreamCreate(NULL,
&feCallback,
&context,
(CFArrayRef)pathsToWatch,
kFSEventStreamEventIdSinceNow,
latency,
kFSEventStreamCreateFlagFileEvents | kFSEventStreamCreateFlagNoDefer);
if (!stream)
{
qDebug() << "Could not create event stream for path";
return;
}
else
{
FSEventStreamScheduleWithRunLoop(stream, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
FSEventStreamStart(stream);
qDebug() << "stream created";
}
}

QString Watcher::getFolderPath()
{
return folderPath_;
}

void  feCallback(ConstFSEventStreamRef streamRef,
void* pClientCallBackInfo,
size_t numEvents,
void* pEventPaths,
const FSEventStreamEventFlags eventFlags[],
const FSEventStreamEventId eventIds[])
{
Q_UNUSED(streamRef)
Q_UNUSED(eventIds)

qDebug() << ((Watcher*)pClientCallBackInfo)->getFolderPath();
}

Я получаю ошибку sigsev в обратном вызове. Кроме того, если я вставлю в контекст просто int, например:

int testInt = 4;
FSEventStreamContext context = {0, &testInt, NULL, NULL, NULL};

В обратном вызове

qDebug() << *((int*)pClientCallBackInfo);

Печатает меня -1

Итак, что я делаю не так?
Спасибо заранее!

0

Решение

Проблема была не связана с этим кодом. Указатель работает нормально, но его объект был потерян.

0

Другие решения


По вопросам рекламы [email protected]