2010-07-25 13 views
1

我試圖(重新)編寫使用USB控制的掃描程序的程序。我已經設置了我的USBIOInterfaceInterface,所以我可以通過管道發送和接收消息。我正在同步呼叫WritePipeTOReadPipeTO,但我想從掃描儀異步讀取。使用USB和CFRunLoopSource的Mac示例代碼

我試過使用ReadPipeAsyncTO,但直到調用超時纔會調用回調。原因似乎是我沒有註冊回調的地方。如果我在異步讀取後添加CFRunLoopRun,那麼它似乎可以工作,但只有通過對CFRunLoopRun進行多次嵌套調用,這不是一個好主意。

我見過的功能:

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

,但我還沒有想出如何告訴來源時,事情發生在該接口上應該叫什麼回調。當我剛創建源代碼並調用ReadPipeAsyncTO時,直到超時纔會調用回調。

是否有相同的示例代碼,所以我可以看到這些函數是如何協同工作的?

回答

0

調用CFRunLoopRun或其NSRunLoop等效項幾乎總是表示程序的架構錯誤。

這聽起來像這將是一個可怕的痛苦的事,但你的應用程序會好得多,並且將工作,使用ReadPipeAsyncTOWritePipeAsyncTO功能,如果你重寫了它使用的運行循環,而不是任何人工循環的你目前有。

+0

你能給我一個指向示例代碼的指針嗎?我當然願意接受建議。原始代碼使用了20年不推薦使用的函數(GetNextEvent),因此體系結構更改大概是爲了... – 2010-07-26 13:26:57

+0

做什麼?正確使用運行循環?任何不直接調用'CFRunLoopRun'或' - [NSRunLoop run ...]'的Cocoa應用程序(或者,當我們處於這種情況時, - [NSApplication nextEvent ::::]')都是合格的。無論如何,運行循環都是存在的,並且應用程序是建立在它上面的,所以你需要做的就是安排它的異步操作,然後完成,返回並讓它在自己的時間內回覆給你。 – 2010-07-26 20:57:09

+0

很可能,您正在嘗試在運行循環運行之前設置連接。你不能用Foundation運行循環來做到這一點,儘管你可以通過使用Core Foundation運行循環來避開它,這就是爲什麼事情對你來說是一半的工作。在主運行循環開始之前,不要初始化您的代碼,而應將其初始化爲已在運行循環內運行的例程的一部分。然後,ReadPipeAsync [TO]應該按預期工作。另外,如果您可以提供幫助,請勿使用超時。 – dgatwood 2014-04-11 21:13:40