8.Python与C之回调函数定义

二次信任 提交于 2019-12-05 14:35:39
  1. 通过工厂方法创建一个类。

    传入参数第一个是返回参数,后面所有都是传入参数类型。

  2. 两个工厂方法

    CFUNCTYPE()cdecl的形式调用方法。

    WINFUNCTYPE()stdcall的方式调用方法。

  3. 通过工厂方法建造出来的类来转义python定义的方法。

    	from ctypes import *
    	ret = CFUNCTYPE(c_int,POINTER(c_int),POINTER(c_int))
    	def cmp(a,b):
    	    return a[0]-b[0]
    	cmp_func = ret(cmp)
    	arrays = (c_int*6)(2,3,2,78,12,53)
    	cdll.msvcrt.qsort(byref(arrays),len(arrays),sizeof(c_int),cmp_func)
    	for i in range(6):
    	    print(arrays[i])
    
  4. 回调函数生命周期

    如果发现回调函数没有被引用,那么就可能会被垃圾回收期回收。

    如果方法在Python可控范围外调用,也就是说在其他代码中调用,如这里的qsort回调,就是在C中调用。ctypes将会为每一次调用创建一个新的仿真线程。大多数情况下没有问题,但是调用过程中,在threading.local中存储的数据无法避免的被释放,即使在同一个C线程中。

  5. 装饰器的方式调用

    	from ctypes import *
    	@CFUNCTYPE(c_int,POINTER(c_int),POINTER(c_int))
    	def cmp(a,b):
    		return a[0]-b[0]
    	arrays = (c_int*6)(2,3,2,78,12,53)
    	cdll.msvcrt.qsort(byref(arrays),len(arrays),sizeof(c_int),cmp)
    	for i in range(6):
    		print(arrays[i])
    
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!