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函数所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)