大佬教程收集整理的这篇文章主要介绍了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 中调用:
以上是大佬教程为你收集整理的C++通过Swig垮线程回调Python函数全部内容,希望文章能够帮你解决C++通过Swig垮线程回调Python函数所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。