c++多线程QThreadpool调用Python脚本时崩溃报错的解决方案二

问题

还是c++ Qt多线程调用Python脚本时的问题。使用QthreadPool的方式调用,按照上次的解决方案也可以实现,虽然可能不出现崩溃问题。但是仍然有很大可能会出现死锁。即调入函数后,再无输出,变成一个黑洞…

解决方案

因为我使用的是QThreadPool线程池,如果将线程池定义为自动释放,那么线程将会反复起关,所以理论上设置为手动释放会好一些。
所以我决定,手动启动线程,假如我先启动八个线程,并在构造函数初始化,在析构函数释放。所以八个线程在启动时就初始化OK,在结束程序时才释放,不在随机控制。分配调用时也是使用Q_Invokable接口调用,这样就能够实现跨线程安全。

一下是实现的部分代码
在这里插入图片描述
pylock 用在调用Python脚本函数的最上面。
也就是下面图片的CallPythonFunction的最上面。
在这里插入图片描述
这个是头文件,集成Qobject,主要是要实现八个线程,然后使用moveToThread函数来实现。
方法声明为Q_Invokable 主要是在主线程来调用线程里面的方法,使用QMetaObiect::invokeMethod方法调用,这样既能跨线程,也能保证线程安全队列。

在这里插入图片描述
这里是初始化和关闭初始化时做的事,还是前面文章说的,有的函数还是不能调用。但是我这里启用线程后,不会反复开关,一直到关闭程序才释放。理论上是所有八个线程只需要调用一次初始化,但是测试发现,每个线程都需要初始化一次。

希望帮助到各位困惑的您!

编辑:myhappyandy

### 使用C++多线程调用Python代码 为了实现C++中的多线程调用Python代码,可以采用`pybind11`库作为接口工具[^1]。此方法不仅简化了嵌入过程还提供了高效的性能表现。 #### 安装依赖项 首先安装必要的开发环境组件,包括但不限于编译器支持以及`pybind11`本身: ```bash pip install pybind11 ``` 对于Linux用户可能还需要额外配置一些包管理系统的资源以获取完整的构建链路。 #### 创建Python模块 定义一个简单的Python函数保存在一个名为`example.py`文件里: ```python def add(a, b): return a + b ``` #### 编写C++代码并集成Python解释器 下面是一个利用`pybind11`封装上述Python功能的例子,在这里创建了一个新的线程去执行来自外部脚本的操作: ```cpp #include <iostream> #include <thread> #include <pybind11/embed.h> // Everything needed for embedding namespace py = pybind11; void run_python_code() { try { py::scoped_interpreter guard{}; // Start the interpreter and keep it alive auto example_module = py::module_::import("example"); int result = example_module.attr("add")(2, 3).cast<int>(); std::cout << "Result from Python function: " << result << '\n'; } catch (const py::error_already_set& e) { std::cerr << "Error calling python code: " << e.what(); } } int main(int argc, char* argv[]) { std::thread t(run_python_code); if(t.joinable()) { t.join(); } return 0; } ``` 这段程序展示了如何初始化Python解释器并通过它访问之前准备好的`.py`文件内的特定逻辑;同通过标准模板库(`STL`)下的`<thread>`实现了基本的并发控制机制。 #### 构建项目 确保链接正确的标志位给定编译命令,比如使用GNU Compiler Collection(GCC): ```bash g++ -O3 -Wall -shared -std=c++17 -fPIC `python3-config --includes` \ cpp_call_py.cpp -o cpp_call_py.so -lpybind11 -pthread ``` 注意这里的选项参数会依据具体平台有所变化,请参照官方文档调整适合自己的设置[^2]。 #### 运行测试 最后运行生成的目标可执行文件验证一切正常工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值