我正在尝试(重新)编写一个使用 USB 控制的扫描仪的程序。我已经设置了 USBIOInterfaceInterface
,因此我可以通过管道发送和接收消息。我成功同步调用 WritePipeTO
和 ReadPipeTO
,但我想异步从扫描仪读取。
我尝试使用ReadPipeAsyncTO
,但回调永远不会被调用,直到调用超时。原因似乎是我没有在某处注册回调。如果我在异步读取之后添加一个 CFRunLoopRun ,那么它似乎可以工作,但只能通过对 CFRunLoopRun 进行许多嵌套调用来实现,这不是一个好主意。
我见过这些功能:
err = (*usbInterfaceInterface)->CreateInterfaceAsyncEventSource(usbInterfaceInterface, &cfSource);
CFRunLoopAddSource(CFRunLoopGetCurrent(), cfSource, kCFRunLoopDefaultMode);
但我还没有弄清楚如何告诉源当该接口(interface)上发生某些事情时应该调用什么回调。当我刚刚创建源并调用 ReadPipeAsyncTO
时,直到超时才会调用回调。
是否有相同的示例代码,以便我可以了解这些函数如何协同工作?
最佳答案
调用 CFRunLoopRun
或其 NSRunLoop 等效项,几乎总是表明您的程序架构错误。
听起来这会是一件非常痛苦的事情,但是如果您使用 ReadPipeAsyncTO
和 WritePipeAsyncTO
函数,您的应用程序会好得多,并且可以正常工作。重写它以使用运行循环而不是您当前拥有的任何手动循环。
关于cocoa - 使用 USB 和 CFRunLoopSource 的 Mac 示例代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3330773/