Расширение многопоточного API C ++ для Python с Boost.Python - PullRequest
0 голосов
/ 10 сентября 2018

У меня есть 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);
}
...