Я пытаюсь (пере) написать программу, которая использует сканеры, управляемые через USB. У меня настроен USBIOInterfaceInterface
, так что я могу отправлять и получать сообщения по каналам. Я успешно вызываю WritePipeTO
и ReadPipeTO
синхронно, но я хочу читать со сканера асинхронно.
Я пытался использовать ReadPipeAsyncTO
, но обратный вызов никогда не вызывается до истечения времени ожидания вызова. Причина, по-видимому, в том, что я где-то не регистрирую обратный вызов. Если я добавлю CFRunLoopRun
после асинхронного чтения, то он, похоже, будет работать, но только за счет множества вложенных вызовов CFRunLoopRun
, что не может быть хорошей идеей.
Я видел функции:
err = (*usbInterfaceInterface)->CreateInterfaceAsyncEventSource(usbInterfaceInterface, &cfSource);
CFRunLoopAddSource(CFRunLoopGetCurrent(), cfSource, kCFRunLoopDefaultMode);
но я не понял, как сообщить источнику, какой обратный вызов следует вызывать, когда что-то происходит на этом интерфейсе. Когда я просто создаю источник и вызываю ReadPipeAsyncTO
, обратный вызов не вызывается до истечения времени ожидания.
Есть ли где-нибудь такой же пример кода, чтобы я мог видеть, как эти функции ДОЛЖНЫ работать вместе?