C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了C++通过Swig垮线程回调Python函数大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

C++ 定义 CallBACk 类. PyThreadStateLock 保证垮线程调用成功:

 

 

#include <Python/Python.h>
class CallBACk
{
public:
    CallBACk(){}
    
    virtual ~CallBACk(){}
    virtual void call(ObjWithPyCallBACk& object){}
};

class ObjWithPyCallBACk
{
public:
    
    ObjWithPyCallBACk();
    ~ObjWithPyCallBACk();
    void setCallBACk(CallBACk &callBACk);
    void call(); 
    
private:
    void NotifyThread();
    CallBACk* callBACk_;
};
class PyThreadStateLock { public: PyThreadStateLock(void) { state = PyGILState_Ensure( ); } ~PyThreadStateLock(void) { PyGILState_Release( state ); } private: PyGILState_STATE state; };

 

CallBACk.cpp

 

ObjWithPyCallBACk::ObjWithPyCallBACk() : callBACk_(NULL)
{
    Py_Initialize();
    PyEval_InitThreads();
    PyEval_ReleaseLock();
}

ObjWithPyCallBACk::~ObjWithPyCallBACk()
{    
}

void ObjWithPyCallBACk::setCallBACk(CallBACk &callBACk)
{
    callBACk_ = &callBACk;
}

void ObjWithPyCallBACk::call()
{
    if ( ! callBACk_ )
    {
        std::cerr << "No callBACk is set.\n";
    }
    else
    {
        thread(&ObjWithPyCallBACk::NotifyThread,this).detach();//call in another thread
        //callBACk_->call(*this);//call directly
        
    }
}

void ObjWithPyCallBACk::NotifyThread()
{
    class PyThreadStateLock PyThreadLock;//fix segmentation fault 
    callBACk_->call(*this);
}

 

.i 文件

%module(directors="1") cb
%{
   #include "CallBACk.h"
%}
%feature("director") CallBACk;

%include "CallBACk.h"

 

在 python 中调用

 

import cb

class CB(cb.CallBACk):
    def __init__(self):
        super(CB,self).__init__()
    def call(self,X):
        print("Hello from CB!")
        print(X)

o = cb.objWithPyCallBACk()
mycb=CB()
o.setCallBACk(mycb)
o.call()

大佬总结

以上是大佬教程为你收集整理的C++通过Swig垮线程回调Python函数全部内容,希望文章能够帮你解决C++通过Swig垮线程回调Python函数所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。