C语言Swig跨线程回调Python函数,如何改写为长尾?

2026-04-16 23:592阅读0评论SEO资源
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计243个文字,预计阅读时间需要1分钟。

C语言Swig跨线程回调Python函数,如何改写为长尾?

C++ 定义 Callback 类,使用 PyThreadStateLock 保证线程安全,成功调用线程函数:实现线程安全的回调机制。

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

C语言Swig跨线程回调Python函数,如何改写为长尾?

#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()

本文共计243个文字,预计阅读时间需要1分钟。

C语言Swig跨线程回调Python函数,如何改写为长尾?

C++ 定义 Callback 类,使用 PyThreadStateLock 保证线程安全,成功调用线程函数:实现线程安全的回调机制。

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

C语言Swig跨线程回调Python函数,如何改写为长尾?

#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()