我和一个朋友正在开发一个使用 Boost::Python 的应用程序。我在 C++ 中定义了一个接口(也是一个纯虚拟类),通过 Boost::Python 向用户公开,用户必须从它继承并创建一个类,应用程序采用该类并将其用于某些回调机制。
到目前为止,一切都很顺利。现在,函数回调可能需要一些时间(用户可能编写了一些繁重的东西)......但是我们需要重新绘制窗口,所以它看起来不会“卡住”。我们想为此使用 Boost::Thread . 一次只会运行一个回调(没有其他线程会同时调用 python),所以我们认为这不会是一个很大的问题......因为我们不使用 python 内部的线程,也不在为 python 包装的 C++ 代码。
我们所做的是在 Py_Initialize() 之后调用 PyEval_InitThreads(),然后,在它自己的 boost 线程中调用函数回调之前,我们使用宏 PY_BEGIN_ALLOW_THREADS 和,以及当线程结束时使用宏 PY_END_ALLOW_THREADS。
我想我不需要说执行永远不会到达第二个宏。每次运行时都会显示几个错误......但总是在调用实际回调时出现。我用谷歌搜索了很多,甚至阅读了一些关于线程的 PEP 文档,但他们都在谈论 python 模块中的线程(我不认为它只是一个暴露的纯虚拟类)或 python 中的线程,而不是关于主应用程序从多个线程调用 Python。
请帮忙,这让我沮丧了几个小时。
附言。帮助!