C++通过Swig垮线程回调Python函数

C++通过Swig垮线程回调Python函数,第1张

概述C++ 定义 Callback 类. PyThreadStateLock 保证垮线程调用成功:     #include <Python/Python.h>class Callback{public: Callback(){} virtual ~Callback(){} virtual void call(ObjWithPyCallback&

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 cbclass 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函数所遇到的程序开发问题。

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

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1210549.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存