Используя 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)
Бог знает почему, но нить не выходит из заявления. Что интересно, так это то, что он получает события и отправляет их, но не выходит. Это связано с тем, как я определил эту функцию?
Возвращает ли метод, если вы вручную отправили событие, например. 'PostEventToQueue (GetMainEventQueue(), dummy_event, kEventPriorityStandard);'? – technomage
Хорошая точка. я попробую сразу. – Jatin
Аргумент с плавающей запятой должен быть «double». – technomage