2011-09-06 13 views
8

C++ kütüphanesine bir cython tabanlı arabirim uygularım. Normal işlevlerle çalışan bir geri çağırma sistemi uyguladım, ancak bağlı yöntemleri geçerken garip bir şekilde başarısız oluyor. Bu kod başlangıçta çalıştırıldığındaCython geri arama işlevi için düzgün çalışıyor, ancak bağlı yöntem için değil

class RenderCanvas(GLCanvas): 
    def __init__(self, parent): 
     self.scene = cybraincase.pyScene() 
     self.scene.setDrillButtonCallback(self.OnDrillButtonPress) 

    def OnDrillButtonPress(self, event): 
     print event 

, bu basılır: <bound method RenderCanvas.OnDrillButtonPress of <UI.RenderCanvas; proxy of <Swig Object of type 'wxGLCanvas *' at 0x42b70a8> >>

bunu aramaya çalışıyorum nasıl

cdef extern from "VolumeHapticTool.h": 
    cdef cppclass HDButtonEvent: 
     bool isPressed() 
     unsigned int getButtonId() 
     Vec3[float] getPosition() 

    ctypedef void (*HDButtonCallback)(HDButtonEvent, void *) 

cdef extern from "Scene.h": 
    cdef cppclass Scene: 
     Scene() 
     void setDrillButtonCallback(HDButtonCallback, void*) 

cdef void pyHDButtonCallback(HDButtonEvent e, void *user_data): 
    print <object>user_data 
    (<object>user_data)((e.isPressed(), e.getButtonId(), topy_vec3f(e.getPosition()))) 

cdef class pyScene: 
    cdef Scene * m_scene 
    def __init__(self): 
     self.m_scene = new Scene() 

    def __del__(self): 
     del self.m_scene 

    def setDrillButtonCallback(self, func): 
     print func 
     self.m_scene.setDrillButtonCallback(pyHDButtonCallback, <void*>func) 

Ve burada: İşte benim Cython kodunun bir bölümüdür

Doğru görünüyor. Geri arama tetiklendiğinde sorun şu şekilde yazdırılır: <bound method Shell.readline of <wx.py.shell.Shell; proxy of <Swig Object of type 'wxStyledTextCtrl *' at 0x3a12348> >>

Tamamen farklı bir sınırlama yöntemi çağrılmaktadır. Ancak, OnDrillButtonPress statik bir yöntem yaparken, <function OnDrillButtonPress at 0x042FC570> hem başlatmaya hem de çağrıları tetiklemeye yazdırılır.

Sınırlama yöntemlerini void * olarak kaydetmeyle bir uyumsuzluk var mı?

cevap

3

Stefan Behnel ve Mark Florisson'un cython tartışma grubundaki yorumları sayesinde sorun, benim bağlı yöntemimin referansının kapsam dışı kalması ve çöplerin toplanmasıydı.

çözeltisi

bunun için oldu: kullanılan duruncaya kadar sınıfta bağımlı yöntem başvuru tutarak

cdef class pyScene: 
    cdef Scene * m_scene 
    cdef object drill_button_func 

    def setDrillButtonCallback(self, func): 
     self.m_scene.setDrillButtonCallback(pyHDButtonCallback, <void*>func) 
     self.drill_button_func = func 

, o kadar temiz yok.

İlgili konular