2013-04-02 1 views
0

JNA를 사용하여 Mac에서 Carbon 프레임 워크를 사용하여 OS 이벤트를 수신하는 API를 만들었습니다. 지금과 같이 정의 Carbon.framework의 기능이있다 :스레드가 ReceiveNextEvent에서 차단되는 중

inNumTypes

어떤 이벤트가 발생할하는 경우는 이벤트 유형의 수 (0 기다리는 :

OSStatus ReceiveNextEvent (
ItemCount inNumTypes, //ItemCount is a 32-bit iteration count 
const EventTypeSpec *inList, //EventTypeSpec is a structure 
EventTimeout inTimeout,//EventTimeout is double-length integer of type EventTime 
Boolean inPullEvent, 
EventRef *outEvent 
); 

문서이 말한다 반환하는이 함수). inList. 우리가 기다리고있는 이벤트 타입의리스트. 어떤 이벤트라도이 함수를 반환해야한다면 NULL을 전달한다.

시간 종료 반환하기 전에 대기 할 시간입니다 (kEventDurationForever 전달 권장).  lue

inPullEvent 다음 일치하는 이벤트를 대기열에서 제거하려면이 매개 변수를 true로 전달하십시오.

outEvent 전달 된 목록과 일치하는 다음 이벤트를 가리키는 포인터입니다. inPullEvent 매개 변수에서 true를 전달하면 해당 이벤트는 사용자 소유이므로 완료되면 해제해야합니다.

반환 값 이벤트가 수신되었거나 시간 만료되었거나 현재 이벤트 루프가 종료되었는지 여부를 나타내는 결과입니다. 가능한 값은 "Carbon Event Manager 결과 코드"(257 페이지)를 참조하십시오. 토론

이 함수는 지정된 유형의 다음 이벤트를 가져 오려고 시도합니다. 이벤트 대기열의 이벤트가 일치하지 않으면이 함수는 일치하는 이벤트가 도착하거나 시간 초과가 만료 될 때까지 현재 이벤트 루프를 실행합니다. 타이머가 작동하는 것을 제외하고이 함수 내부에서 이벤트가 도착하기를 기다리면서 응용 프로그램이 차단됩니다. 같은 들어

, 내 JNA 호출에서 아래 작성했습니다 :

NativeLong ReceiveNextEvent(NativeLong inNumTypes, EventTypeSpec[] inList,float inTimeout ,boolean inPullEvent, EdSdkLibrary.__EdsObject outEvent); 

__EdsObjectPointerType를 확장합니다. 스레드가 문 밖으로 나오지 않는 이유, 그러나 하나님은 알고

carbon.ReceiveNextEvent(new NativeLong(1), null, 1.0f, true, eventRef)

public static class __EdsObject extends PointerType { 
    public __EdsObject(Pointer address) { 
     super(address); 
    } 
    public __EdsObject() { 
     super(); 
    } 
}; 

EventTypeSpec is: 
public class EventTypeSpec extends Structure { 

    public int eventClass; 
    public int eventKind; 

    protected List getFieldOrder() { 
     return Arrays.asList(new String[]{"eventClass", "eventKind"}); 
    } 
} 

및 전화

이다. 흥미로운 점은 이벤트를 받고 파견하지만 출현하지 않는다는 것입니다. 함수를 정의한 방식과 관련이 있습니까?

+0

수동으로 이벤트를 보내면 메소드가 반환됩니까? 'PostEventToQueue (GetMainEventQueue(), dummy_event, kEventPriorityStandard);'? – technomage

+0

좋은 포인트. 나는 곧바로 노력할 것이다. – Jatin

+0

부동 소수점 인수는 'double'이어야합니다. – technomage

답변

1

매핑이 잘못되어 네이티브 코드가 이벤트를 쓸 수있는 이벤트 구조를 제공하지 않습니다. (당신의 메소드 서명이 실제로 올바른 때 따라서, 충돌을 만 초기화되지 않은 포인터를 제공했다) 네이티브 코드는 이벤트 데이터를 기록 할

NativeLong ReceiveNextEvent(NativeLong inNumTypes, EventTypeSpec[] inList, double inTimeout, byte inPullEvent, Pointer outEvent); 

당신 충분한 크기의 outEvent에 버퍼를 제공해야합니다.

double 매개 변수가 아니라 float으로 충돌하지 않았다는 사실은 단지 우연한 일입니다.실제로 일어나는 일은 inTimeout 이전의 모든 인수가 스택의 잘못된 위치에 쓰여지므로 결과가 정의되지 않습니다.

그러나 이러한 이벤트에 대한 OS 이벤트 큐를보고있는 이유는 알 수 없습니다. EDSDK 문서에 따르면 이벤트는 EDSDK 라이브러리에 직접 등록 된 콜백으로 전송됩니다. docs 또는 EDSDK 샘플 코드에서 OS 이벤트 대기열에 대한 언급이 없습니다.

+0

물론입니다. edsdk 라이브러리를 사용하여 이벤트가 발생할 때 호출해야하는 리스너를 등록합니다. 그러나 위의 윈도우와 맥에서, 위와 같이하지 않으면 어떤 이유로 이벤트를 얻지 못합니다. http://stackoverflow.com/questions/15216740/get-events-from-os – Jatin

+0

이제 해보십시오. 감사. – Jatin