gpt4 book ai didi

python - ctypes 来自其他线程的异步回调

转载 作者:行者123 更新时间:2023-11-30 23:12:39 26 4
gpt4 key购买 nike

我正在尝试从 C 线程接收异步回调,但每次调用此类回调时,Python 都会崩溃。

这是 C 回调原型(prototype):

/*! Type declaration for the frame ready callback function.
@sa IC_SetFrameReadyCallback
@sa IC_SetCallbacks
@retval IC_SUCCESS Callback was set successfully
@retval IC_ERROR An error occurred, e.g. hGrabber is NULL.*/
typedef void (*FRAME_READY_CALLBACK)
(HGRABBER hGrabber, unsigned char* pData, unsigned long frameNumber, void* );

这是注册回调的 C 函数:

/*! Enable frame ready callback.
@param hGrabber Handle to a grabber object.
@param cb Callback function of type FRAME_READY_CALLBACK
@param x1_argument_in_void_userdata Pointer to some userdata.
@retval IC_SUCCESS Callback was set successfully
@retval IC_ERROR An error occurred, e.g. hGrabber is NULL.
@sa FRAME_READY_CALLBACK*/
int AC IC_SetFrameReadyCallback(
HGRABBER hGrabber,
FRAME_READY_CALLBACK cb,
void* x1_argument_in_void_userdata);

最后,这是我的 Python 代码的一部分:

FRAME_READY_CALLBACK = CFUNCTYPE(c_int, ICGrabber, POINTER(c_ubyte), c_ulong, c_void_p)

...

library = windll.LoadLibrary('tisgrabber_x64')

...

IC_SetFrameReadyCallback = library.IC_SetFrameReadyCallback
IC_SetFrameReadyCallback.restype = c_int
IC_SetFrameReadyCallback.argtypes = [ICGrabber, FRAME_READY_CALLBACK, c_void_p]

...

def frame_ready(icGrabber, data, frameNumber, unused):
print "oh"
#print "Frame", frameNumber, "ready!!!"
return 1


IC_InitLibrary(0) #library init function

...

IC_SetFrameReadyCallback(hGrabber, FRAME_READY_CALLBACK(frame_ready), None)

...

IC_SoftwareTrigger() #send signal
time.sleep(2) # while sleeping, the C thread calls the.. frame_ready callback

你猜怎么着? sleep 时,它崩溃了!

最佳答案

这是错误的代码:

IC_SetFrameReadyCallback(hGrabber, FRAME_READY_CALLBACK(frame_ready), None)

这是有效的:

cframe_ready = FRAME_READY_CALLBACK(frame_ready)
IC_SetFrameReadyCallback(grab, cframe_ready, None)

问题:

我没有保留对回调的引用,因此 Python 垃圾收集器清理了它。

关于python - ctypes 来自其他线程的异步回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29720455/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com