Пример кода для Mac с использованием USB и CFRunLoopSource - PullRequest
1 голос
/ 25 июля 2010

Я пытаюсь (пере) написать программу, которая использует USB-сканеры. У меня настроен USBIOInterfaceInterface, поэтому я могу отправлять и получать сообщения через каналы. Я успешно звоню WritePipeTO и ReadPipeTO синхронно, но хочу читать со сканера асинхронно.

Я пытался использовать ReadPipeAsyncTO, но обратный вызов никогда не вызывается до истечения времени ожидания вызова. Причина в том, что я не регистрирую обратный вызов где-то. Если я добавлю CFRunLoopRun после асинхронного чтения, то, похоже, он будет работать, но только при наличии множества вложенных вызовов CFRunLoopRun, что не может быть хорошей идеей.

Я видел функции:

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

но я не понял, как сообщить Source, какой обратный вызов должен вызываться, когда что-то происходит на этом интерфейсе. Когда я просто создаю источник и вызываю ReadPipeAsyncTO, обратный вызов не вызывается до истечения времени ожидания.

Есть ли где-то такой же пример кода, чтобы я мог видеть, как эти функции ПРЕДПОЛАГАЕТСЯ работать вместе?

1 Ответ

0 голосов
/ 26 июля 2010

Вызов CFRunLoopRun, или его эквивалент NSRunLoop, почти всегда является признаком неправильной архитектуры вашей программы.

Звучит так, как будто это будет ужасной болью, но ваше приложение будет намного лучше- и будет работать, используя функции ReadPipeAsyncTO и WritePipeAsyncTO - если вы переписали его, чтобы использовать цикл выполнения вместо того, чтобы использовать какой-либо ручной цикл, который у вас есть в настоящее время.

...