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 が segfault します。