gpt4 book ai didi

c - OSX 命令行 C 应用程序中的线程管理

转载 作者:行者123 更新时间:2023-12-02 00:05:56 25 4
gpt4 key购买 nike

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

#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;
}

所以我确定使用主线程运行循环(或者可能是一个单独的线程)应该完成这项工作,但我不确定在等待事件时让线程休眠的最佳方式。我对 Apple 的 API 不够熟悉,不知道该怎么做。

感谢您的帮助!

最佳答案

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

给你。

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

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

关于c - OSX 命令行 C 应用程序中的线程管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18394688/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com