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!非常感谢你。完全正确。我没想到你也给我写了一个例子。你真好@埃利亚内斯克