Python Ctypes为c函数分配内存



我目前有一个python回调函数,它使用ctypes库调用c函数。c函数需要一个指向结构(例如animal_info_s)的指针。我实例化结构并将其作为指针传递给c函数,它就工作了。我遇到的问题是,当我有多个线程调用回调时,我发现正在传递的信息在线程之间混淆了。

class animal_info_s(ctypes.Structure):
    _fields_ = [('dog_type',          ctypes.c_uint16),
                ('cat_type',          ctypes.c_uint16),
                ('bird_type',         ctypes.c_uint16),
                ('epoch_time',        ctypes.c_uint16),
                ('more_information',  ctypes.c_uint16)]

_mod = ctypes.cdll.LoadLibrary('bbuintflib.dll')
animal_info_s = animal_info_s()
get_animal_data = _mod.get_animal_data
get_animal_data.argtypes = [ctypes.POINTER(animal_info_s)]
get_animal_data.restype =   ctypes.c_int
# Python Callback
def GetAnimalData():
    animal_info_p = animal_info_s
    res = get_animal_data(animal_info_p)
    if (res != 0):
        print("Failed to get animal info")
        return
    print ("Receive Time - %dnDog: %dnCat: %dnBird:%d" %(animal_info_p.epoch_time,
                                                            animal_info_p.dog_type,
                                                            animal_info_p.cat_type,
                                                            animal_info_p.bird_type))

我认为发生的事情是当我实例化结构时,它每次都使用相同的内存位置。如何为每个调用回调的线程创建一个新的内存位置?

下面一行应该被删除。它将名称animal_info_s重新定义为class animal_info_s实例,然后隐藏类。

animal_info_s = animal_info_s()

下面这行应该改成:

animal_info_p = animal_info_s

:

animal_info_p = animal_info_s()

原始行为第一个错误的animal_info_s名称创建了另一个名称,这是线程中使用的唯一实例。建议的行在每次调用回调时创建animal_info_s类的一个新实例。

最新更新