У меня есть C ++ API, который использует несколько потоков, и я расширяю этот API для использования в Python с помощью boost.python.
Я написал класс-оболочку для C ++ API под названием «SDK».Обратные вызовы регистрируются в конструкторе SDK.Идея состоит в том, что API имеет другой поток, который вызывает функцию обратного вызова, когда данные изображения готовы.Код работает на C ++, но функция обратного вызова в моем коде Python никогда не достигается.
Я предполагаю, что это как-то связано с тем, как Python обрабатывает потоки.Я предполагаю, что интерпретатор Python не знает о функции обратного вызова.Я нахожу документацию по этому вопросу довольно скудной.Может кто-нибудь показать мне, что мне не хватает, и какую-то соответствующую документацию?
Это связано с глобальной блокировкой интерпретатора?
SDK.hpp
class SDK{
public:
SDK();
void process_image_callback();
void capture_img_frames(int frames);
private:
bool _capture_image_frame_flag;
int _img_frame_count;
}
SDK.cpp
SDK::SDK()
{
setOnImageFrameCallback(std::bind(&SDK::process_image_callback, this,
std::placeholders::_1));
}
void SDK::process_image_callback()
{
std::cout << "entered image callback" << std::endl;
if(_capture_image_frame_flag){
_img_frame_count++;
}
}
void SDK::capture_img_frames(int frames)
{
_img_frame_count = 0;
_capture_image_frame_flag = true;
while (_img_frame_count < frames){
// Wait while callback is processed
}
}
BOOST_PYTHON_MODULE(SDK)
{
using namespace boost::python;
class_<SDK>("SDK", init<>())
.def("capture_img_frames", &SDK::capture_img_frames)
.def("process_image_callback", &SDK::process_image_callback)
;
}
int main(){
std::unique_ptr<SDK> sdk;
sdk->capture_img_frames(1);
}