我有用 Boost Python 包装的 c++ 代码。这个想法是,我创建了一个共享对象,我的 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
语句(“启动线程”和“线程启动”)中获得输出。
但是 GUI 被冻结了。这与python GIL有什么关系吗?我尝试将这些宏添加到boost_python_wrapper_code.cpp
并重新编译,但它会导致 python GUI 在启动时立即出现段错误。