Я связываю Python с библиотекой C ++, используя Cython.Мне нужна функция обратного вызова, которую может вызвать код c ++.Мне также нужно передать ссылку на конкретный объект Python этой функции.Это все очень ясно из демонстрации обратного вызова.
Однако я получаю различные ошибки при вызове обратного вызова из потока c ++ (pthread):
- Передача указателя на функцию и класса / объекта (как void *) в c ++
- Сохранить указатели в c ++
- Начать новый поток (pthread), запустив цикл
- Вызвать функцию, используя указатель сохраненной функции, и передать обратно классуказатель (void *)
- В python: приведение void * обратно к классу / объекту
- Вызов метода вышеуказанного класса / объекта (ошибка)
Шаги 2 и 3 выполняются на языке c ++.
В основном это ошибки сегментации, но иногда я получаю жалобы на некоторые вызовы Python низкого уровня.
У меня точно такой же код, где ясоздать поток в Python и вызвать обратный вызов напрямую.Это работает хорошо.Таким образом, сам обратный вызов работает.
Мне нужен отдельный поток, работающий на c ++, так как этот поток взаимодействует с оборудованием, а иногда вызывает мой обратный вызов.
Я также трижды проверил всеуказатели, которые передаются вокруг.Они указывают на допустимые местоположения.
Я подозреваю, что есть некоторые проблемы при использовании классов Cython из потока c ++ ..?
Я использую Python 2.6.6 в Ubuntu.
Итак, мой вопрос: могу ли я манипулировать объектами Python из не-Python-потока?Если нет, есть ли способ сделать поток Python-совместимым?(pthread)
Это минимальный обратный вызов, который уже вызывает проблемы при вызове из потока c ++:
cdef int CheckCollision(float* Angles, void* user_data):
self = <CollisionDetector>user_data
return self.__sizeof__() # <====== Error