我目前有一个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
类的一个新实例。