Использование CFRunLoop в приложении пользовательского интерфейса - PullRequest
0 голосов
/ 17 февраля 2011

Я получил некоторый код из консольного приложения, которое я написал, и я пытаюсь приспособиться для использования в приложении на основе пользовательского интерфейса. Он регистрирует ловушку событий для контроля всей системы перемещения мыши. Кто-то посоветовал мне создать и запустить поток для настройки цикла событий, чтобы я не блокировал приложение (код вызывается из applicationDidFinishLaunching).

Я должен быть честным, я просмотрел несколько документов о циклах выполнения и совершенно запутался :-( Мой код просто зависает при вызове функции listen.

static MouseListener* listener = nil;

CGEventRef eventOccurred(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void* refcon) {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    event = [listener eventOccurred:proxy:type:event:refcon];

    [pool release];

    return event;
}


@implementation MouseListener

-(MouseListener*) myinit {
    if (self = [super init]) {
        eventThread = [[NSThread alloc] initWithTarget:self                              
                                              selector:@selector(listen:)                              
                                                object:nil];        
        [eventThread start];
    }   

    return self;
}

-(void)listen:(NSObject*) object {        
    if (!listener) {
        listener = self;  

        CFMachPortRef tap = CGEventTapCreate(kCGHIDEventTap, 
                                             kCGHeadInsertEventTap, 
                                             kCGEventTapOptionDefault, 
                                             NSAnyEventMask, 
                                             eventOccurred, 
                                             NULL);

        if (tap) {
            CFRunLoopRef loop = CFRunLoopGetCurrent(); 
            CFRunLoopSourceRef src = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, tap, 0);
            CFRunLoopAddSource(loop, src, kCFRunLoopCommonModes);
            CGEventTapEnable(tap, true);
            //CFRunLoopRun();
            //[[NSRunLoop currentRunLoop] run];
            CFRelease(src);
            CFRelease(tap);
       }
    }
}

-(CGEventRef) eventOccurred:(CGEventTapProxy) proxy: (CGEventType) type: (CGEventRef) event: (void*) refcon {

    // Do stuff, never gets called

    return event;
}

1 Ответ

0 голосов
/ 22 февраля 2011

Мне нужно будет проверить мой код, как только я вернусь домой, но то, что у вас есть, выглядит хорошо (я сделал то же самое, но вместо этого слушал события I / O Kit)CFRunLoopRun () - это функция, которую вы хотите вызвать, однако, почему бы вам просто не добавить сигнал о событии в основной цикл выполнения приложения?Это также спасет любую нить махинаций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...