2014-11-26 1 views
1

현재 이벤트 탭을 사용하는 코드를 작성 중입니다. 그것은 잘 작동하지만, 잘 설명되지 않았거나 100 % 잘 이해하지 못하는 몇 가지 옵션에 대해 몇 가지 질문이 있습니다. 가장 자주 설명 할 때, 이벤트 탭 절차는 "그냥해라."하지만 더 이상의 설명이 없으며 몇 가지 다른 가능성이 있음을 알았습니다. 그리고 사과 개발자 문서는 나에게 너무 많이 깨닫지 못했습니다 (너무 적거나 그래서 한 번에 너무 많은 정보를 원하시면 ...) :osX : runLoop 옵션 (이벤트 탭을 만들 때)


CFMachPortRef machPortRef = CGEventTapCreate(kCGSessionEventTap, kCGTailAppendEventTap, kCGEventTapOptionDefault, kCGEventMaskForAllEvents, eventTapCallback, NULL); 

첫 번째 줄, 전혀 문제는 아주 분명하다.


//// -----> kCFAllocatorDefault or NULL ???   
CFRunLoopSourceRef runLoopSource = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, machPortRef, 0); 

1) 여기서, 난 항상 당신이 kCFAllocatorDefault을 넣어해야한다고보고 있지만, 모든 문서의 상태는 우리가 NULL을 통과 왜 "The allocator to use to allocate memory for the new object. Pass NULL or kCFAllocatorDefault to use the current default allocator."는, 그 할당 자 또는 다른 악어에 대해 잘 알고있는 그래서하지 ??? 나는 NULL이 매우 효율적인 할당자가 아니라고 가정합니다 ... (이것은 꽤 흥미로운 질문입니다, 그냥 호기심입니다).


//// -----> CFRunLoopGetMain() or CFRunLoopGetCurrent() ??? 
CFRunLoopRef runLoop = CFRunLoopGetMain(); 
//CFRunLoopRef runLoop = CFRunLoopGetCurrent(); 

2) CFRunLoopGetMain()와 메인 루프와 CFRunLoopGetCurrent()와 전류 루프를 받고의 차이는 무엇인가요 ??? 어떤 경우에 사용하는 것이 가장 좋습니까 ???


//// -----> kCFRunLoopCommonModes or kCFRunLoopDefaultMode 
CFRunLoopAddSource(runLoop, runLoopSource, kCFRunLoopCommonModes); 
//CFRunLoopAddSource(runLoop, runLoopSource, kCFRunLoopDefaultMode); 

3)과 kCFRunLoopCommonModeskCFRunLoopDefaultMode 차이는 무엇입니까 ??? 내가 이해 한 바에 따르면 kCFRunLoopCommonModes에는 kCFRunLoopDefaultMode이 포함되어 있습니다. 그래서 언제 당신이 하나 또는 다른 사용합니까 ???


CGEventTapEnable(machPortRef, true); 

은 도니는 다르게 당신의 탭을 활성화하는 것을 잊지 마십시오.

미리 감사드립니다. 나는 이것들이 분명하고 간결한 설명을 할 자격이 있다고 생각한다. 그것은 사람들에게 이벤트 도청에 들어가는 데 큰 도움과 시간 절약이다.

+1

이러한 API에 대한 많은 문서가 있습니다. 이벤트 탭에 대한 문서를보고 있었습니까? 아니면'CFRunLoop'에 대한 문서를 보셨습니까? [CFRunLoop Reference] (https://developer.apple.com/library/ios/documentation/corefoundation/reference/CFRunLoopRef/index.html) [관련 개념 가이드] (https://developer.apple.com/library/ios) /documentation/Cocoa/Conceptual/Multithreading/RunLoopManagement/RunLoopManagement.html) –

+0

고마워, 나는 두 번째 것을 보지 못했다 (개념적 가이드). –

답변

1

1) 중요하지 않습니다. kCFAllocatorDefault을 전달하면 NULL을 전달하여 기본 할당자를 명시 적으로 선택하므로 암시 적으로 기본 할당자가 선택됩니다. 시스템은 물론 NULL을 사용하지 않고 기본 할당자를 사용합니다. 내가 기본 ("예, 기본 할당이 필요합니다"), 그렇지 않으면 내가 NULL을 사용하는 신경 경우

는 개인적으로 나는, 그런 일이 명시 적으로 확인 ("상관 없어, 시스템이 잘 할 것입니다.")

2) 모든 스레드에는 실행 루프가 부착되어 있습니다. CFRunLoopGetMain()을 사용하면 주 스레드의 실행 루프가 생기고 CFRunLoopGetCurrent()은 스레드의 실행 루프를 얻습니다. 코드는 현재 실행 중입니다. 코드가 주 스레드에서 실행되는 경우에도 마찬가지입니다. 그렇지 않으면 다른 실행 루프가 실행됩니다.

주 스레드의 주 실행 루프는 주 스레드가 자동으로 실행될 때 자동으로 시작됩니다.

프로세스에 추가 스레드 (자체 실행 루프 포함)를 추가 할 수 있습니다.일반적으로 스레드의 실행 루프를 사용하지 않으려는 것은 추가 (백그라운드) 스레드에서 더 긴 계산을 수행하기 때문입니다. 그러나 런 루프를 통해 무언가가 처리되는 경우이 백그라운드 스레드에서 런 루프가 필요한 경우가 있습니다. 이자형. 네트워킹.

3) 매 초마다 뭔가를 쓰고 마우스로 메뉴를 입력하는 기본 실행 루프에 타이머를 추가하십시오. 차이점을 볼 수 있습니다 ...

기본 모드에 추가 된 소스는 실행 루프가 기본 모드 인 경우에만 전달됩니다. 즉, 응용 프로그램이 비정형 상태에있을 때 - 긴 이야기를 짧게하는 것을 의미합니다. 예를 들어 &을 드래그하는 동안 메뉴 또는 "로컬 실행 루프 디스 패칭"이 기본 모드에서 수행되지 않습니다.

단순히 모드를 소스 그룹으로 생각하십시오. 실행 루프가 해당 모드에서 실행되는 경우 모드의 모든 소스가 전달됩니다. 그래서 그것은 일종의 출처 선택입니다.

공통 실행 루프 모드의 소스는 항상 모드와 독립적으로 발송되기 때문에 특별합니다.

+0

"공통 실행 루프 모드의 소스는 항상 모드와 독립적으로 발송됩니다"라는 것은 정확하지 않습니다. 공통 모드 ** s ** (복수형)은 일련의 모드에 있습니다. 이 시스템은 특정 표준 모드를 ​​공통 모드 세트에 추가합니다. 앱은'CFRunLoopAddCommonMode()'를 사용하여 자신의 모드를 세트에 추가 할 수 있습니다. 공통 모드에서 소스를 예약하는 것은 세트의 각 모드에서 스케줄링하는 것과 다릅니다. 원본이 공통 모드 세트에 추가 된 새 모드로 자동 예약되기 때문입니다. –

+0

두 개 이상의 루프 모드를 실행할 수 있습니다. 그러나 이것이 당신의 요지를 알지 못한다. Q : –

+0

매우 명확한 답변을 주셔서 감사합니다. 그것은 내가 원했던 바로 그 것이었다. 켄 토머스 (Ken Thomases)가 말한 바에 따르면, 내가 맞히면 공통 모드에 자동으로 포함되지 않는 커스텀 모드를 추가 할 수있다. 그러나 공통 모드를 사용하면 모든 표준 작업이 고려 될 것입니다. 내가 맞습니까? –

관련 문제