C语言Swig跨线程回调Python函数,如何改写为长尾?
- 内容介绍
- 文章标签
- 相关推荐
本文共计243个文字,预计阅读时间需要1分钟。
C++ 定义 Callback 类,使用 PyThreadStateLock 保证线程安全,成功调用线程函数:实现线程安全的回调机制。
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()
本文共计243个文字,预计阅读时间需要1分钟。
C++ 定义 Callback 类,使用 PyThreadStateLock 保证线程安全,成功调用线程函数:实现线程安全的回调机制。
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()

