我有一段C++代码,正打算使用Boost Python对其进行封装。我的想法是,创建一个共享对象,让我的Python GUI可以使用它来实例化变量,进而调用C++功能。
这段C++代码涉及到一些繁重的操作,我希望能够让封装好的对象并发运行,以避免GUI被阻塞。
我使用CMake编译了一个Boost Python共享对象:
find_package(Boost COMPONENTS system thread python REQUIRED)
find_package(PythonLibs REQUIRED)
include_directories(${Boost_INCLUDE_DIRS})
include_directories(${PYTHON_INCLUDE_DIRS})
link_directories(${Boost_LIBRARY_DIRS})
link_directories(${PYTHON_LIBRARIES})
set(Boost_USE_MULTITHREADED ON)
add_library(mynewlibinpython SHARED src/boost_python_wrapper_code.cpp)
target_link_libraries(mynewlibinpython ${Boost_LIBRARIES} ${PYTHON_LIBRARIES} mylibincpp)
我可以在Python中实例化对象,但它会导致GUI阻塞。以下是我的Python代码的一般片段:
from mynewlibinpython import *
class CppWrapper(QtCore.QObject):
def __init__(self):
super(CppWrapper,self).__init__()
#some more initialization...
@QtCore.Slot()
def heavy_lifting_cpp_invocation():
#constructor that takes a long time to complete
self.cpp_object = CppObject()
在具有成员函数的对象中,当我在GUI中按下按钮时触发该函数:
class GuiObjectWithUnimportantName:
def __init__(self):
#inititalization
self.cpp_thread = QThread()
self.cpp_wrapper = CppWrapper()
def function_triggered_by_button_press(self):
self.cpp_wrapper.moveToThread(self.cpp_thread)
self.cpp_thread.started.connect(self.cpp_wrapper.heavy_lifting_cpp_invocation)
print "starting thread"
self.cpp_thread.start()
print "Thread started"
因此,cpp代码将开始执行其任务,我也会立即从两个print
语句("starting thread"和"Thread started")中获得输出。
但GUI被冻结了。这与Python GIL有关吗?我尝试将这些宏添加到boost_python_wrapper_code.cpp
中并重新编译,但导致Python GUI在启动时立即崩溃。
Py_BEGIN_ALLOW_THREADS
和Py_END_ALLOW_THREADS
,或者在.cpp原始源代码周围使用(例如在重载函数实现周围)? - eqzx