需要 CFRunLoopRun() 但希望它解除阻塞
Need to CFRunLoopRun() but want it unblocking
我在 cocoa 申请 OSX 中有以下代码:
void *callbackInfo = NULL; // could put stream-specific data here.
FSEventStreamRef stream;
CFAbsoluteTime latency = 1.0; /* Latency in seconds */
/* Create the stream, passing in a callback */
stream = FSEventStreamCreate(NULL,
&mycallback,
callbackInfo,
pathsToWatch,
kFSEventStreamEventIdSinceNow, /* Or a previous event ID */
latency,
kFSEventStreamCreateFlagFileEvents//kFSEventStreamCreateFlagNone /* Flags explained in reference */
);
/* Create the stream before calling this. */
FSEventStreamScheduleWithRunLoop(stream, CFRunLoopGetCurrent(),kCFRunLoopDefaultMode);
FSEventStreamStart(stream);
CFRunLoopRun();
}
此代码会收到有关文件系统更改的通知并做出相应的反应(回调函数不在代码段中)。
我现在的问题是 CFRunLoopRun() 正在阻塞。 IE。代码的进一步执行停止。但是,我正在寻找一种可能性,即我可以开始观察文件系统更改,但也可以再次停止它(例如,从另一个对象)。
我想到的一个选项是只启动循环一秒钟,然后检查全局变量。但是,我平时不喜欢全局变量....
这里有没有人有好主意,如何解决这个问题?购买开销并将执行放到单独的线程中是个好主意吗?
提前致谢!
诺伯特
CFRunLoopRun()
运行 将永远循环当前 运行,直到有人在 运行 循环中注册调用 CFRunLoopStop()
。这不是你想要做的,除非你正在做一些非常花哨的事情。
如果你想要 FSEventStream
回调到 运行,你只需在 运行 循环中注册它并离开它,你不必明确地对运行之后循环,将偶数流注册为源即可。
如果您想停止观察您调用 FSEventStreamStop()
的流。
一个Cocoa应用程序有一个隐含的运行循环,所以只需删除CFRunLoopRun();
考虑通过 Grand Central Dispatch (GCD) 使用调度队列,而不是在 运行 循环上安排流
我在 cocoa 申请 OSX 中有以下代码:
void *callbackInfo = NULL; // could put stream-specific data here.
FSEventStreamRef stream;
CFAbsoluteTime latency = 1.0; /* Latency in seconds */
/* Create the stream, passing in a callback */
stream = FSEventStreamCreate(NULL,
&mycallback,
callbackInfo,
pathsToWatch,
kFSEventStreamEventIdSinceNow, /* Or a previous event ID */
latency,
kFSEventStreamCreateFlagFileEvents//kFSEventStreamCreateFlagNone /* Flags explained in reference */
);
/* Create the stream before calling this. */
FSEventStreamScheduleWithRunLoop(stream, CFRunLoopGetCurrent(),kCFRunLoopDefaultMode);
FSEventStreamStart(stream);
CFRunLoopRun();
}
此代码会收到有关文件系统更改的通知并做出相应的反应(回调函数不在代码段中)。
我现在的问题是 CFRunLoopRun() 正在阻塞。 IE。代码的进一步执行停止。但是,我正在寻找一种可能性,即我可以开始观察文件系统更改,但也可以再次停止它(例如,从另一个对象)。
我想到的一个选项是只启动循环一秒钟,然后检查全局变量。但是,我平时不喜欢全局变量....
这里有没有人有好主意,如何解决这个问题?购买开销并将执行放到单独的线程中是个好主意吗?
提前致谢! 诺伯特
CFRunLoopRun()
运行 将永远循环当前 运行,直到有人在 运行 循环中注册调用 CFRunLoopStop()
。这不是你想要做的,除非你正在做一些非常花哨的事情。
如果你想要 FSEventStream
回调到 运行,你只需在 运行 循环中注册它并离开它,你不必明确地对运行之后循环,将偶数流注册为源即可。
如果您想停止观察您调用 FSEventStreamStop()
的流。
一个Cocoa应用程序有一个隐含的运行循环,所以只需删除CFRunLoopRun();
考虑通过 Grand Central Dispatch (GCD) 使用调度队列,而不是在 运行 循环上安排流