我和一位朋友正在开发一个使用Boost :: Python的应用程序。我已经在C ++中定义了一个接口(很好是一个纯虚拟类),通过Boost :: Python公开给用户,用户必须从中继承并创建一个类,应用程序将其用于某些回调机制。
一切都很顺利。现在,函数回调可能需要一些时间(用户可能已编写了一些重要的东西)...但我们需要重新绘制窗口,因此它看起来不会“卡住”。我们想使用Boost :: Thread来实现这一点。一次只能运行一个回调(没有其他线程会同时调用python),所以我们认为它不会那么大......因为我们不在python中使用线程,也不在包装为python的C ++代码。
我们做的是在Py_Initialize()之后调用PyEval_InitThreads(),然后,在调用它自己的boost线程中的函数回调之前,我们使用宏PY_BEGIN_ALLOW_THREADS,并在线程结束时使用宏PY_END_ALLOW_THREADS。
我想我不需要说执行永远不会到达第二个宏。它每次运行时都会显示几个错误...但是在调用实际回调时总是这样。我已经google了很多,甚至阅读了一些关于线程的PEP文档,但是他们都讨论了python模块中的线程(我不认为它只是一个纯粹的虚拟类暴露)或者在python中进行线程化,而不是主要的应用程序从多个线程调用Python。
请帮助,这让我感到沮丧几个小时。
聚苯乙烯。帮助!
答案 0 :(得分:1)
Python可以从多个线程串行调用,我不认为这是一个问题。听起来我的错误只是来自糟糕的C ++代码,因为你说错误发生在PY_BEGIN_ALLOW_THREADS之后和PY_END_ALLOW_THREADS之前。
如果您知道这不是真的,您可以发布更多的实际代码并准确显示其错误的位置以及它给出的确切错误吗?