Каков современный эквивалент GetNextEvent в Какао? - PullRequest
1 голос
/ 23 июля 2010

Я портирую архаичную программу C ++ / Carbon на Obj-C и Cocoa. Текущая версия использует асинхронное чтение USB и GetNextEvent для чтения данных.

Когда я пытаюсь скомпилировать это в Objective C, GetNextEvent не найден, потому что он находится в среде Carbon.

Поиск поддержки Apple ничего не дает.

РЕДАКТИРОВАТЬ ДОБАВИТЬ:

Хорошо, я пытаюсь запустить сканер документов через USB. Я настроил USBDeviceInterface и USBInterfaceInterface (который придумал THAT name ???), и я звоню (*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() в РАБОЧЕМ коде, USBDoneProc не будет вызван до истечения времени асинхронного чтения.

Так что мне кажется, что мне нужно что-то, чтобы вернуть управление обработчику событий, чтобы прерывания USBRead могли фактически прерывать и вызывать USBDoneProc ...

Имеет ли это какой-то смысл?

thanks.

Ответы [ 3 ]

2 голосов
/ 23 июля 2010

Полагаю, ближайшая вещь к эквиваленту Какао будет -[NSApplication nextEventMatchingMask:untilDate:inMode:dequeue:].Но имейте в виду, что GetNextEvent архаично даже для углерода.Предпочтительным способом передачи событий является схема «не звоните нам, мы вам позвоним», когда приложение вызывает NSApplicationMain или RunApplicationEventLoop и события отправляются вам.

ИЗМЕНИТЬ для добавления: У вашего приложения есть нормальный цикл обработки событий?Если это так, возможно, WaitForScan может запустить таймер углерода и вернуться к циклу событий.Каждый раз, когда срабатывает таймер, делайте то, что вы делали в цикле WaitForScan.

1 голос
/ 11 сентября 2011

есть USB-хидапи, который работает для Mac на Windows.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.В настоящее время я ищу, как преобразовать это в Какао.

Вы также пытаетесь переместить свой код в какао, верно?дайте мне знать, если узнаете;Я опубликую это здесь, если получу.

С уважением, Дэвид

0 голосов
/ 24 июля 2010

Рассматривали ли вы выкинуть все это и использовать вместо этого поддержку сканера Image Kit в новой версии 10.6?Даже если это так, написание драйвера TWAIN для него может быть проще (и, безусловно, лучше), чем пытаться превратить Какао в форму GetNextEvent.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...