2015-01-15 3 views
3

저는 Mac OS X에서 프로그래밍을하는 초보자입니다.mac os x - usb hid - 수신 장치가 추가/장치가 콜백을 제거하는 방법?

다음은이 tutorial입니다.

와 나는이 프로그램을 가지고 : 내가 삽입 할 때 콜백을 가져 오거나 USB 포트의 모든 HID 장치를 제거하지 않기 때문에 내가 잘못하고있는 무슨

#include <stdio.h> 
#include <IOKit/hid/IOHIDManager.h> 
#include <IOKit/hid/IOHIDKeys.h> 
#include <CoreFoundation/CoreFoundation.h> 

static void Handle_DeviceMatchingCallback(void *inContext, IOReturn inResult, void *inSender, IOHIDDeviceRef inIOHIDDeviceRef) 
{ 
    puts("YAY Handle_DeviceMatchingCallback"); 
} 

static void Handle_DeviceRemovalCallback(void *inContext, IOReturn inResult, void *inSender, IOHIDDeviceRef inIOHIDDeviceRef) 
{ 
    puts("YAY Handle_DeviceRemovalCallback"); 
} 

int main() 
{ 
    IOHIDManagerRef HIDManager = IOHIDManagerCreate(kCFAllocatorDefault, kIOHIDOptionsTypeNone); 
    IOHIDManagerSetDeviceMatching(HIDManager, NULL); 

    IOHIDManagerRegisterDeviceMatchingCallback(HIDManager, &Handle_DeviceMatchingCallback, NULL); 
    IOHIDManagerRegisterDeviceRemovalCallback(HIDManager, &Handle_DeviceRemovalCallback, NULL); 

    IOHIDManagerScheduleWithRunLoop(HIDManager, CFRunLoopGetMain(), kCFRunLoopDefaultMode); 

    IOReturn IOReturn = IOHIDManagerOpen(HIDManager, kIOHIDOptionsTypeNone); 
    if(IOReturn) puts("IOHIDManagerOpen failed."); 

    while(1) 
    { 
     puts("sleeping..."); 
     sleep(1); 
    } 

    return 0; 
} 

.

답변

1

IOHIDManagerScheduleWithRunLoop에 연결되어 있습니다. 실행 루프이므로 시작해야합니다. while 루프가 해결책이 아닙니다. 따라서 콜백을 받으려면 while 루프를 CFRunLoopRun() 호출로 대체해야합니다.

RunLoops에 대한 자세한 정보는 documentation입니다.

+0

내 프로그램을 사용하여 끝났을 때 루프에서 어떻게 벗어나나요? 나는 다음을 시도해 본다. CFRunLoopRun(); CFRunLoopRef run_loop = CFRunLoopGetCurrent(); 내가 종료하고 싶을 때 전화 : CFRunLoopStop (run_loop); 하지만 run_loop은 NULL입니다. –

+0

이 메서드는 즉시 반환되지 않으므로이 코드를 콜백에서 호출해야합니다. 따라서 이벤트 (타이머 등)에 대한 새로운 콜백을 생성하고 거기에서'CFRunLoopStop()'을 호출하거나 타이머를 RunLoop에서 제거하여 타이머를 멈추게 할 수 있습니다. –