2013-07-08 69 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