0

我正在 Mac 上使用 cmake 创建一个简单的 C++ 应用程序。C++ 源代码文件中有一个 main,用于创建 C++ 类。在这个类中,我分配了目标 C 对象,将其自身添加到 NSNotificationCenter 中的观察者。而且我没有收到这些通知。有一个代码:

通知.h

class LaunchNotification {
public:
    LaunchNotification();
    virtual ~LaunchNotification();

    void StartNotifications();
    void StopNotifications();

private:
    void    *monitor;
};

通知.mm

@interface Monitor : NSObject
-(id) init;
-(void) appLaunchedNotification :(NSNotification *) notification;
-(void) appTerminatedNotification :(NSNotification *) notification;
@end

@implementation Monitor

- (id) init
{
    self = [super init];
    if (self)
    {
        count = 0;
        NSNotificationCenter *notCenter = [[NSWorkspace sharedWorkspace] notificationCenter];

        [notCenter addObserver : self
            selector:@selector(appLaunchedNotification:)
            name:NSWorkspaceDidLaunchApplicationNotification
            object:nil];

        [notCenter addObserver : self
            selector:@selector(appTerminatedNotification:)
            name:NSWorkspaceDidTerminateApplicationNotification
            object:nil];
    }

    return self;
}

- (void) appLaunchedNotification : (NSNotification *) notification
{
    NSString *path = [[notification userInfo]objectForKey: @"NSApplicationPath"];
}

- (void) appTerminatedNotification : (NSNotification *) notification
{
    NSString *path = [[notification userInfo]objectForKey: @"NSApplicationPath"];
}

- (void) dealloc
{
    NSNotificationCenter *notCenter = [[NSWorkspace sharedWorkspace] notificationCenter];

    [notCenter removeObserver : self];

    [super dealloc];
}
@end

LaunchNotification::LaunchNotification() : monitor(NULL)
{}

LaunchNotification::~LaunchNotification()
{
    StopNotifications();
}

void LaunchNotification::StartNotifications()
{
    if (NULL == monitor)
    {
        monitor = [[Monitor alloc] init];
    }
}

void LaunchNotification::StopNotifications()
{
    if (NULL != monitor)
    {
        [(id)monitor release];
    }
}
4

1 回答 1

1

您需要一个运行循环,否则 NSWorkspace 没有机制来控制您的应用程序线程以发布通知。

虽然文档说运行循环是自动创建的,但它们不会自动执行。想一想:一个线程如何同时运行您的代码并在运行循环中运行代码?

您在监视通知中心时需要执行的任何任务都需要在运行循环事件的上下文中完成,例如在一个NSTimer事件上,或者您需要一个单独的线程来处理其他内容。

于 2013-06-28T15:27:17.260 回答