我正在将一个古老的C ++ / Carbon程序移植到Obj-C和Cocoa。当前版本使用异步USB读取和GetNextEvent读取数据。

当我尝试在目标C中进行编译时,找不到GetNextEvent,因为它在Carbon框架中。

搜索Apple支持不会产生任何用处。

编辑添加:

好的,所以我想做的是通过USB运行文档扫描仪。我已经设置了USBDeviceInterface和USBInterfaceInterface(谁输入了那个名称??),然后调用(*usbInterfaceInterface)->WritePipeTO()要求扫描仪进行扫描。我相信这可行。至少平板灯在页面上移动...

然后,我尝试使用*(usbInterfaceInterface))->ReadPipeAsyncTO()读取数据。我给这个函数一个回调函数,USBDoneProc()

总体结构为:

StartScan()
WaitForScan()


StartScan()调用WritePipeTOReadPipeAsyncTO

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也是古老的。处理事件的首选方式是“不给我们打电话,我们给您打电话”方案,该应用程序调用NSApplicationMainRunApplicationEventLoop并将事件分派给您。

编辑添加:您的应用是否有正常的事件循环?如果是这样,也许WaitForScan可以启动Carbon计时器并返回事件循环。每次计时器触发时,请执行WaitForScan循环中的操作。

10-08 05:23