2010-07-25 3 views
1

USB로 제어되는 스캐너를 사용하는 프로그램을 (다시) 쓰려고합니다. 내 USBIOInterfaceInterface을 설정 했으므로 파이프를 통해 메시지를 보내고받을 수 있습니다. WritePipeTOReadPipeTO을 동 기적으로 호출하지만 스캐너에서 비동기 적으로 읽으려고합니다.USB 및 CFRunLoopSource를 사용하는 Mac 샘플 코드

ReadPipeAsyncTO을 사용해 보았지만 통화 시간 초과가 될 때까지 콜백이 호출되지 않습니다. 그 이유는 내가 콜백을 어딘가에 등록하지 않는다는 것입니다. 비동기 읽기 후에 CFRunLoopRun을 추가하면 작동하는 것으로 보입니다. 그러나 많은 중첩 호출을 사용하여 CFRunLoopRun으로 호출하는 것이 좋을 수는 없습니다.

나는 기능을 본 적이 :

err = (*usbInterfaceInterface)->CreateInterfaceAsyncEventSource(usbInterfaceInterface, &cfSource); 
    CFRunLoopAddSource(CFRunLoopGetCurrent(), cfSource, kCFRunLoopDefaultMode); 

하지만 난 뭔가 그 인터페이스에서 발생 때 호출해야하는지 콜백 소스를 이야기하는 방법을 알아 내지 못했다. 소스를 생성하고 ReadPipeAsyncTO을 호출하면 타임 아웃 할 때까지 콜백이 호출되지 않습니다.

어딘가에 동일한 샘플 코드가 있으므로이 함수들이 함께 작동하도록 어떻게 지원되는지 확인할 수 있습니까?

답변

0

CFRunLoopRun 또는 해당 NSRunLoop 코드를 호출하는 것은 거의 항상 프로그램의 아키텍처가 잘못되었다는 신호입니다.

ReadPipeAsyncTOWritePipeAsyncTO 함수를 사용하면 응용 프로그램이 훨씬 더 좋을 것입니다. 수동 반복 루프 대신 실행 루프를 사용하도록 다시 작성한 경우 현재 가지고있다.

+0

저에게 그렇게하는 샘플 코드에 대한 포인터를 줄 수 있습니까? 나는 확실히 제안에 열려 있습니다. 원래 코드는 20 년 동안 사용되지 않는 함수 (GetNextEvent)를 사용했기 때문에 아키텍처 변경은 아마도 어쨌든 순서대로 이루어졌습니다. –

+0

무엇을합니까? 실행 루프를 올바르게 사용합니까? 'CFRunLoopRun' 또는'- [NSRunLoop run ...]'을 직접 호출하지 않는 코코아 응용 프로그램 (또는 우리가 접속하는 동안'- [NSApplication nextEvent ::::]')이 적합합니다. 어쨌든 실행 루프가 있고 응용 프로그램이 빌드되어 있으므로 비동기 작업을 예약 한 다음 마치고 돌아와서 자신의 시간에 다시 돌려 보내면됩니다. –

+0

실행 루프가 실행되기 전에 연결을 설정하려고합니다. Foundation 실행 루프를 사용하면 그렇게 할 수 없지만, 핵심 기반 실행 루프를 사용하여 일탈 할 수는 있습니다. 그렇기 때문에 상황이 중간에 작동하는 것입니다. 기본 실행 루프가 시작되기 전에 코드를 초기화하는 대신 실행 루프 내에서 이미 실행중인 루틴의 일부로 초기화하십시오. 그런 다음 ReadPipeAsync [TO]가 예상대로 작동해야합니다. 또한 도움이 될만한 시간 초과는 사용하지 마십시오. – dgatwood