2010-07-23 34 views
1

我正在將一個古老的C++/Carbon程序移植到Obj-C和Cocoa。當前版本使用異步USB讀取和GetNextEvent來讀取數據。Cocoa中的GetNextEvent的現代等價物是什麼?

當我嘗試在Objective 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()調用,則USBDoneProc直到異步讀取管道超時纔會被調用。

所以在我看來,我需要的東西,把控制權返回給事件處理程序,以便USBRead中斷實際上中斷,使USBDoneProc得到所謂...

這有任何意義嗎?

thanks. 
+1

我剛剛發現GetNextEvent在MacOS的系統7棄用!這個事實根本不能幫助我,但它確實給了我一個道德上的優越感,比我寫這個東西的同事還有道德上的優越感,並且在15年內沒有更新它。*嘆息* – 2010-07-23 20:12:25

回答

2

我想最近的事情可可相當於將-[NSApplication nextEventMatchingMask:untilDate:inMode:dequeue:]。但請記住,即使對於碳,GetNextEvent也是陳舊的。處理事件的首選方式是「不要打電話給我們,我們會打電話給你」方案,應用程序將呼叫NSApplicationMainRunApplicationEventLoop,並將事件發送給您。

編輯添加:你的應用程序有一個正常的事件循環?如果是這樣,也許WaitForScan可以啓動Carbon定時器並返回到事件循環。每次定時器啓動時,都要執行WaitForScan循環中的操作。

+0

是的,我是使用15年的舊代碼。我不知道什麼是從OS9,什麼是從10.1棄用,或什麼是實際上不棄用....我會把更多的細節問題,以解釋我想要做什麼。 – 2010-07-23 18:35:29

+0

我知道SO會通知你新的答案和評論,但我不知道它是否會通知你編輯的答案......所以,看看我編輯的答案。 :-) – JWWalker 2010-07-23 19:40:43

0

您是否考慮過拋出所有東西,並改用Image Kit的10.6新版掃描儀支持?即使它是自定義的,爲它編寫TWAIN驅動程序可能比試圖將可可轉換爲GetNextEvent形狀更容易(當然更好)。

+0

我正在編寫的程序必須支持10.5系統,甚至可能是10.4。相信我,我只是喜歡,我不需要支持10.3 – 2010-07-24 18:02:23

1

有一個USB hidapi適用於Windows上的mac。 http://www.signal11.us/oss/hidapi/

這可能對你有幫助嗎?它可以正常工作(我可以列出連接的USB設備,並連接/寫入/讀取到設備)。但是,如果我的USB設備在應用程序運行期間連接/斷開連接,我看不到新的連接/斷開連接的設備。

參見:https://github.com/signal11/hidapi/issues/14

如果我添加以下代碼hidapi,然後hidapi檢測到新的USB設備。

#include <Carbon/Carbon.h> 
void check_apple_events() { 
    printf("check_apple_events\n"); 
    RgnHandle cursorRgn = NULL; 
    Boolean gotEvent=TRUE; 
    EventRecord event; 
    while (gotEvent) { 
     gotEvent = WaitNextEvent(everyEvent, &event, 0L, cursorRgn); 
    } 
} 

我需要在OSX10.5上編譯它,因爲它使用Carbon而不是Cocoa。 我目前正在尋找如何將其轉化爲可可。

你也試圖將你的代碼移動到可可,對不對? 讓我知道你是否知道;我會在這裏發佈它,如果我得到它。

問候, 大衛

相關問題