2013-08-23 122 views
3

我正在学习Mac App开发,从命令行应用程序和Core Foundation API开始。我想要做的是在应用程序在终端中运行时监听文件系统事件。当用户退出时,它会干净地关闭流并退出。以下是我有...OSX命令行C应用程序中的线程管理

#include <CoreServices/CoreServices.h> 
#include <stdio.h> 

void eventCallback(FSEventStreamRef stream, void *callbackInfo, size_t numEvents, void *paths, FSEventStreamEventFlags flags[], FSEventStreamEventId eventId[]) { 
    printf("Test"); 
} 

int main(int argc, const char * argv[]) 
{ 
    CFStringRef mypath = CFSTR("/Path/to/folder"); 
    CFArrayRef paths = CFArrayCreate(NULL, (const void **)&mypath, 1, NULL); 

    CFRunLoopRef loop = CFRunLoopGetMain(); 
    FSEventStreamRef stream = FSEventStreamCreate(NULL, eventCallback, NULL, paths, kFSEventStreamEventIdSinceNow, 3.0, kFSEventStreamCreateFlagNone); 
    FSEventStreamScheduleWithRunLoop(stream, loop, kCFRunLoopDefaultMode); 
    FSEventStreamStart(stream); 
    bool done; 

    # Somehow put main thread to sleep here... 

    # On exit of application 
    FSEventStreamStop(stream); 
    FSEventStreamInvalidate(stream); 
    FSEventStreamRelease(stream); 

    return 0; 
} 

所以我决定,使用任一主线程运行循环(或者一个单独的线程)来做这件事情,但我不知道其中的最佳途径让线程在等待事件时进入睡眠状态。我对苹果的API不太了解,不知道该怎么做。

感谢您的帮助!

+1

我鼓掌你的努力! – trojanfoe

回答

3
# Somehow put main thread to sleep here… 
CFRunLoopRun(); 

你走了。

CFRunLoopRun()为当前线程(在本例中为主线程)旋转运行循环。由于您已将FS事件流附加到主运行循环,因此您的FS事件将由此运行循环处理,因此您的回调函数将被调用。运行循环将继续旋转,直到您致电CFRunLoopStop()(如果您调用它)。

但是,您需要决定如何处理程序终止。可可应用程序可以使用方便的-[NSApplicationDelete willTerminate:]方法来执行清理操作。由于您没有使用Cocoa,因此您必须自行推出,可能需要使用atexit(3)signal(3)并使用^C退出程序。

+0

哇,这很容易!我不知道为什么我无法在任何地方找到。谢谢! –