我正在将一个古老的C ++ / Carbon程序移植到Obj-C和Cocoa。当前版本使用异步USB读取和GetNextEvent读取数据。
当我尝试在目标C中进行编译时,找不到GetNextEvent,因为它在Carbon框架中。
搜索Apple支持不会产生任何用处。
编辑添加:
好的,所以我想做的是通过USB运行文档扫描仪。我已经设置了USBDeviceInterface和USBInterfaceInterface(谁输入了那个名称??),然后调用(*usbInterfaceInterface)->WritePipeTO()
要求扫描仪进行扫描。我相信这可行。至少平板灯在页面上移动...
然后,我尝试使用*(usbInterfaceInterface))->ReadPipeAsyncTO()
读取数据。我给这个函数一个回调函数,USBDoneProc()
。
总体结构为:
StartScan()
WaitForScan()
StartScan()
调用WritePipeTO
和ReadPipeAsyncTO
WaitForScan()
具有:while (deviceActive) {
EventRecord event;
GetNextEvent(0,&event);
if (gDataPtr != saveDataPtr) { // more data up the timeout
timeoutTicks = TickCount() + 60 * 60;
saveDataPtr = gDataPtr;
}
if (TickCount() > timeoutTicks) {
deviceActive = false;
}
}
同时,
USBDoneProc
将gDataPtr递增到到目前为止已读取的数据的结尾。据我所知,它在异步读取期间被多次调用,并由回调自动调用。如果我在工作代码中拒绝了
GetNextEvent()
调用,则在异步readpipe超时之前,不会调用USBDoneProc
。因此在我看来,我需要一些东西来将控制权交还给事件处理程序,以便USBRead中断实际上可以中断并使
USBDoneProc
get调用...这有任何意义吗?
thanks.
最佳答案
我想最接近可可等效物的是-[NSApplication nextEventMatchingMask:untilDate:inMode:dequeue:]
。但是请记住,即使对于Carbon,GetNextEvent
也是古老的。处理事件的首选方式是“不给我们打电话,我们给您打电话”方案,该应用程序调用NSApplicationMain
或RunApplicationEventLoop
并将事件分派给您。
编辑添加:您的应用是否有正常的事件循环?如果是这样,也许WaitForScan可以启动Carbon计时器并返回事件循环。每次计时器触发时,请执行WaitForScan循环中的操作。