2013-04-02 1 views
0

Используя JNA, я создал api для получения событий ОС с Mac с использованием рамки Carbon. Теперь, есть функция в Carbon.framework определяется как:Взаимозаменяемость потока в ReceiveNextEvent

OSStatus ReceiveNextEvent (
ItemCount inNumTypes, //ItemCount is a 32-bit iteration count 
const EventTypeSpec *inList, //EventTypeSpec is a structure 
EventTimeout inTimeout,//EventTimeout is double-length integer of type EventTime 
Boolean inPullEvent, 
EventRef *outEvent 
); 

документация говорит это:

inNumTypes

Количество типов событий ждать (0, если какое-либо событие должно вызывать эта функция возвращается). inList. Список типов событий, которые мы ожидаем (передайте NULL, если какое-либо событие должно вернуть эту функцию).

inTimeout Время ожидания перед возвратом (передача kEventDurationForever является предпочтительной).  

inPullEvent Pass верно для этого параметра, чтобы удалить следующее событие совпадения из очереди.

outEvent Указатель на следующее событие, которое соответствует списку. Если вы передали true в параметре inPullEvent, событие принадлежит вам, и вы должны его отпустить, когда это будет сделано.

Возвращаемое значение Результат, указывающий, было ли событие получено, истечение времени ожидания или цикл текущего события прекратились. См. «Коды результатов управления углеродными событиями» (стр. 257) для возможных значений. Обсуждение

Эта функция пытается получить следующее событие указанного типа. Если никакие события в очереди событий не совпадают, эта функция будет запускать текущий цикл событий до тех пор, пока не произойдет какое-либо событие, или истечет время ожидания. За исключением срабатывания таймеров ваше приложение блокируется, ожидая появления событий, когда внутри этой функции.

Для того же, я написал ниже в моем ЮНА вызова:

NativeLong ReceiveNextEvent(NativeLong inNumTypes, EventTypeSpec[] inList,float inTimeout ,boolean inPullEvent, EdSdkLibrary.__EdsObject outEvent); 

__EdsObject расширяет PointerType.

public static class __EdsObject extends PointerType { 
    public __EdsObject(Pointer address) { 
     super(address); 
    } 
    public __EdsObject() { 
     super(); 
    } 
}; 

EventTypeSpec is: 
public class EventTypeSpec extends Structure { 

    public int eventClass; 
    public int eventKind; 

    protected List getFieldOrder() { 
     return Arrays.asList(new String[]{"eventClass", "eventKind"}); 
    } 
} 

и вызов, как carbon.ReceiveNextEvent(new NativeLong(1), null, 1.0f, true, eventRef)

Бог знает почему, но нить не выходит из заявления. Что интересно, так это то, что он получает события и отправляет их, но не выходит. Это связано с тем, как я определил эту функцию?

+0

Возвращает ли метод, если вы вручную отправили событие, например. 'PostEventToQueue (GetMainEventQueue(), dummy_event, kEventPriorityStandard);'? – technomage

+0

Хорошая точка. я попробую сразу. – Jatin

+0

Аргумент с плавающей запятой должен быть «double». – technomage

ответ

1

Ваше сопоставление неверно, и вы не предоставляете структуру событий, в которую нативный код может записать событие.

NativeLong ReceiveNextEvent(NativeLong inNumTypes, EventTypeSpec[] inList, double inTimeout, byte inPullEvent, Pointer outEvent); 

Вы должны обеспечить буфер outEvent достаточного размера для нативного кода для записи данных о событиях (вы только обеспечивающие неинициализированный указатель, таким образом краха, когда ваш метод подпись была на самом деле правильно).

Тот факт, что вы не столкнулись с параметром float, а не double, - это просто случайность.Фактически происходит то, что все аргументы до inTimeout записываются не в то место в стеке, поэтому ваши результаты будут неопределенными.

Я не понимаю, почему вы смотрите на очередь событий ОС для этих событий. Согласно документации EDSDK, события отправляются на обратные вызовы, зарегистрированные непосредственно в библиотеке EDSDK. Я не вижу упоминания о очереди событий ОС в документах или образце кода EDSDK.

+0

Абсолютно. Используя библиотеку edsdk, я регистрирую слушателей, которые должны вызываться, когда происходит событие. Но на окнах и на mac, если я не делаю выше, я почему-то не получаю события. http://stackoverflow.com/questions/15216740/get-events-from-os – Jatin

+0

Работаем сейчас. Благодарю. – Jatin

Смежные вопросы