2013-07-08 52 views
0

我有一个C回调具有下列原型:ctypes的回调被忽略

typedef void (* FrameDataCallBack)(TProcessedDataProperty* Attributes, unsigned char *BytePtr); 

这个回调函数意味着是用户定义的,并且附接至具有以下功能的照相机。

BUFCCDUSB_InstallFrameHooker(int FrameType, FrameDataCallBack FrameHooker); 

我已经试过原型回调多种方式:

1.

def frame_callback(attributes, frame): 
for i in xrange(480*640): #Reads bytes and stores them in an array for future use 
    frame_buffer[i/640][i%640] = frame[i*config.bin_no] 
print "hi" 
CMPFUNC = ctypes.CFUNCTYPE(None, 
          ctypes.POINTER(TProcessedDataProperty), 
          ctypes.POINTER(ctypes.c_ubyte))(frame_callback) 

2.

CMPFUNC = ctypes.CFUNCTYPE(None, 
         ctypes.POINTER(TProcessedDataProperty), 
         ctypes.POINTER(ctypes.c_ubyte)) 
@CMPFUNC 
def frame_callback.... 
#function declaration 

3.

CMPFUNC = ctypes.CFUNCTYPE(None, 
          ctypes.POINTER(TProcessedDataProperty), 
          ctypes.POINTER(ctypes.c_ubyte)) 
cbfunc = CMPFUNC(frame_callback) 

我再尝试实例化正确的ARG和restypes的功能之后的回调与

BUFCCDUSB_InstallFrameHooker(0, CMPFUNC): (frame_callback and cb for the respective callback codes) 

连接,但回调不会被调用。我希望有人能指出我对任何可能的错误

+0

你好frank_x,我想在python for mightex相机上做一些编程。你介意与我分享你的代码吗?我真的很感激它! – Gardener85

回答

0

是的,我已经解决了底部。对于任何使用Mightex相机的人来说,它们的回调似乎都需要附加到GUI上。我将部分代码附加到Tkinter按钮,并且回调完美。

+0

回调函数需要被引用以保持活动状态,就像任何其他Python对象一样。这与附加到GUI无关。 – eryksun

+0

回调函数被正确引用,不是?第一种和第三种方法都应该保持活力。我99%肯定它与需要一个窗口的相机有关,通过示例C代码似乎支持这一点。 –

+0

我看不出如何将它附加到GUI元素改变任何东西。回调是一个引用Python函数的结构,以及有关输入和输出数据类型的信息。 C代码从来没有直接看到这一点。它看到一个ffi封装器,它在调用你的Python函数的ctypes中调用另一个封装器。 – eryksun