2010-11-23 8 views
8

Я пишу некоторые привязки SWIG/Python для некоторого кода на C++. Это для того, что называется Kinect Accidental API, у меня есть функции двигателя и светодиода working. Обратные вызовы к классу Listener, которые анализируют и заполняют буферы RGB и глубины, похоже, не вызываются из SWIG. Потоки захвата данных, очевидно, запускаются и начинают запугивать CPU, но отладочные линии от обратного вызова не проходят. Что было бы лучшим способом заполнения буферов данных и их легко получить от python?Связи SWIG C++ с обратным вызовом

class KinectListener 
{ 
    public: 
     virtual ~KinectListener(){}; 
     virtual void KinectDisconnected(Kinect *K) {}; 
     virtual void DepthReceived(Kinect *K) {}; 
     virtual void ColorReceived(Kinect *K) {}; 
     virtual void AudioReceived(Kinect *K) {}; 
}; 

Вот класс слушателя с виртуальными методами, может Python обернутой версию этого класса можно использовать, чтобы наследовать слушатель для класса C++? Я добавил минимальный прослушиватель в C++, и теперь оставшаяся работа заключается в эффективном доступе к массивам с помощью typemaps. В настоящее время я использую эту наивную типографию

%typemap(out) unsigned short [ANY] { 
    int i; 
    $result = PyList_New($1_dim0); 
    for (i = 0; i < $1_dim0; i++) { 
    PyObject *o = PyInt_FromLong((long)$1[i]); 
    PyList_SetItem($result,i,o); 
    } 
} 

Лучшие варианты?

ответ

3

Существует способ использования функции режиссеров. Включите его для KinectListener прокси, одна строка кода:

%feature("director") KinectListener 

Тогда вы можете наследовать от класса KinectListener в питона кода и определить свои функции.

+0

У меня был тот же вопрос - ответ N0vember отвечает на него. Вместо того, чтобы получать указатель на вызываемую функцию, получите указатель на полиморфный класс, где вы знаете имя функции, которую вы планируете вызывать. – Jonathan 2011-02-05 06:14:00

2

По совпадению, я случайно смотрю обратные вызовы с SWIG в данный момент.

SWIG 2.0 documentation says this:

SWIG обеспечивает полную поддержку для указателей функций при условии, что функции обратного вызова определяются в C, а не на целевом языке. ... Однако существующие C-функции могут использоваться в качестве аргументов, если вы устанавливаете их как константы. Один из способов сделать это - использовать директиву% constant, подобную этой ...

Я планирую написать обратный вызов C с рукописным JNI для вызова на Java. Если есть другой способ, я также хотел бы услышать это.