Python 为什么运行pybind11c++;lib还挂着我的主GUI吗?
在我的Python 为什么运行pybind11c++;lib还挂着我的主GUI吗?,python,multithreading,pyqt,pyqt5,pybind11,Python,Multithreading,Pyqt,Pyqt5,Pybind11,在我的PyQt5程序中,我想启动一个运行一些代码的新线程: class SlamThread(QThread): """docstring for SlamThread""" def __init__(self, parent): QThread.__init__(self, parent) def setSlam(self, params): self.params = params def run(self):
PyQt5
程序中,我想启动一个运行一些代码的新线程:
class SlamThread(QThread):
"""docstring for SlamThread"""
def __init__(self, parent):
QThread.__init__(self, parent)
def setSlam(self, params):
self.params = params
def run(self):
self.slam = Slam()
self.slam.setParams(self.params)
self.slam.start()
< > >代码> SLAM <代码>是用C++编写的,用PybDun11./P>转换。
在我的主程序中,代码由qAction
按钮触发:
def startSlam(self, ...):
params = ...
self.thread = SlamThread(self)
self.thread.setSlam(params)
self.thread.start()
for i in range(10):
print('done')
奇怪的是,它确实启动了一个新线程,done
在我的Slam
progrom之前被打印出来。但是,当Slam
启动时,整个程序将挂起,直到Slam
完成
在我的C++ <代码> SLAM 代码中,就好像这个
int Slam::start()
{
init();
...
startSlam();
return 0;
}
其中startSlam
运行需要几分钟。根据在线程中执行对象的时间,必须调用gil\u scoped\u release和gil\u scoped\u acquire:
int Slam::start(){
pybind11::gil_范围的发布;
init();
// ...
pybind11::gil_作用域的获取;
返回0;
}
或在绑定中:
pybind11::class_(mymodule,“Slam”)
.def(pybind11::init())
.def(“setParams”,&Slam::setParams)
.def(“start”,&Slam::start,pybind11::call_guard());
您可以找到完整的测试Bravo!非常感谢你。完全正确。我没想到你也给我写了一个例子。你真好@埃利亚内斯克