gpt4 book ai didi

python - 为什么运行 pybind11 c++ lib 的 pyqt5 QThread 仍然挂起我的主 GUI?

转载 作者:行者123 更新时间:2023-12-01 07:56:34 53 4
gpt4 key购买 nike

在我的 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++编写并由pybind11转换的。

在我的主程序中,代码由 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 程序之前打印。但是,当 Slam 启动时,整个程序会挂起,直到 Slam 完成。

在我的 C++ Slam 代码中,它是这样的

int Slam::start()
{
init();
...
startSlam();
return 0;
}

其中 startSlam 需要几分钟才能运行。

最佳答案

根据docs当对象在线程中执行时,您必须调用 gil_scoped_release 和 gil_scoped_acquire:

int Slam::start(){
pybind11::gil_scoped_release release;
init();
// ...
pybind11::gil_scoped_acquire acquire;
return 0;
}

或者在绑定(bind)中:

pybind11::class_<Slam>(mymodule, "Slam")
.def(pybind11::init<>())
.def("setParams", &Slam::setParams)
.def("start", &Slam::start, pybind11::call_guard<pybind11::gil_scoped_release>());

您可以找到完整的测试here

关于python - 为什么运行 pybind11 c++ lib 的 pyqt5 QThread 仍然挂起我的主 GUI?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55945085/

53 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com