2010-11-23 19 views
8

Estoy escribiendo algunos enlaces SWIG/Python para algunos códigos C++. Esto es para lo que se llama la API accidental de Kinect, tengo las funciones de motor y led working. Las devoluciones de llamada a la clase Listener que analizan y completan los búferes RGB y Depth parecen no ser llamados desde SWIG. Los hilos de captura de datos, evidentemente, se inician y comienzan a acaparar la CPU, pero no salen líneas de depuración de la devolución de llamada. ¿Cuál sería la mejor manera de rellenar los búferes de datos y acceder fácilmente a ellos desde python?SWIG enlaces C++ con devolución de llamada

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) {}; 
}; 

Aquí es la clase de escucha con los métodos virtuales, puede el Python envuelto versión de esta clase se utiliza para heredar oyentes para la clase de C++? Agregué un oyente mínimo en C++ y ahora el trabajo restante es acceder a las matrices de manera eficiente con mapas de tipos. Actualmente estoy usando este ingenuo tipo de mapa

%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); 
    } 
} 

¿Mejores opciones?

Respuesta

3

Hay una forma de utilizar la función de directores. habilitarlo para su proxy KinectListener, una línea de código:

%feature("director") KinectListener 

Entonces se puede heredar de la clase KinectListener en el código python y definir sus funciones.

+0

Tuve la misma pregunta: la respuesta de N0vember lo responde. En lugar de recibir un puntero a una función para llamar, reciba un puntero a una clase polimórfica donde conozca el nombre de la función que planea llamar. – Jonathan

2

Por casualidad, estoy buscando las devoluciones de llamada con SWIG en este momento.

El SWIG 2.0 documentation says this:

SWIG proporciona soporte completo para los punteros de función a condición de que las funciones de devolución de llamada se definen en C y no en el idioma de destino. ... Sin embargo, las funciones C existentes se pueden usar como argumentos, siempre que las instale como constantes. Una forma de hacerlo es usar la directiva% constant como esta ...

Estoy planeando escribir una devolución de llamada en C con JNI escrito a mano para llamar a Java. Si hay otra manera, también me encantaría escucharlo.

Cuestiones relacionadas