当前位置: 首页 > news >正文

【QT代码控制Linux开发板】QT控制嵌入式Linux开发板运行shell脚本

一. 前言

最近遇到了一个很冲突的问题,我想让比如qt代码控制传感器读取的数值大于某个阈值时控制板子的灯亮进行报警。

但是当我在Linux开发板上./运行交叉编译后的qt文件时,想运行开发板的其他shell语句必须先退出qt代码的执行,当然开发板是支持多线程的一种方法就是

./your_qt_application & ./your_script.sh &

但是以上这个情况只能同时运行这两个文件,不能等待某个”时机“运行shell语言,这就很不方便。有没有一种方法可以实现我把想执行的shell脚本语言(或功能)融合进qt代码,当qt代码运行到相应位置时也会同时执行shell脚本?

答案是当然有,而且相当方便嘞!QProcess闪亮登场!

可不敢小瞧它,它可是进程之间通信的利器!具体的用法我就不赘述啦,参考下面两篇文章,讲得很清楚(比笔者专业多了)。

https://blog.csdn.net/lizhong2008/article/details/136840521

https://blog.csdn.net/MrHHHHHH/article/details/135490531

二. 上代码

我就直接上例子了,主要解决的问题就是我开头提到的当传感器超过某个阈值时,进行报警的功能。

(1)首先就是在mainwindow.cpp代码中包含QProcess类

#include <QProcess>

(2)第二步就是创建对象同时在mainwindow.h进行QProcess初始化

QProcess *process; // QProcess对象指针

(3)第三步是直接调用函数,注意我这里是直接调用静态函数execute,所以可以直接调用而无需创建QProcess对象,

else if (risk_level >= 0.6 && risk_level < 0.8) {riskText = "中度风险";color = "orange";QProcess::execute("/bin/sh", QStringList() << "/home/set_led.sh");//ledScriptExecuted = true;  // 标记脚本已执行}

QProcess::execute会在调用时阻塞当前的线程,直到进程完成。也就是说,程序会等待Shell脚本执行完毕后再继续执行后面的代码。

/bin/sh是Unix系统上一个通用的Shell(通常是Bourne Shell或与之兼容的Shell),可以用来执行Shell脚本或直接输入的命令。

同理如果要运行Python脚本

QProcess::execute("python3", QStringList() << "/home/demo.py");

三. 注意事项

(1)因为是采用的静态的execute函数,如果你的脚本代码比较复杂运行时间较长可能会使qt代码界面无响应哦(可以考虑使用QProcess的异步方式来执行脚本),所以比较适用于脚本语言简单,对qt代码实时性要求不高的情况下。下面给出异步方式的示例代码,具体情况需要具体分析。

// 在头文件中包含 QProcess 头文件
#include <QProcess>// 在需要执行脚本的地方创建 QProcess 对象
QProcess *process = new QProcess(this);// 连接信号槽来处理进程结束后的操作(可选)
connect(process, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished),this, [](int exitCode, QProcess::ExitStatus exitStatus){qDebug() << "Process finished with exit code:" << exitCode;});// 启动 Python3 脚本,使用异步方式
process->start("python3", QStringList() << "/home/demo.py");// 检查进程是否启动成功
if (!process->waitForStarted()) {qDebug() << "Failed to start process";
}

以上程序可以实现qt程序继续执行,不必等待脚本进程的执行结果。

(2)使用QProcess前提下是保证想要运行的脚本有可执行权限(特别是/目录下的文件,往往需要手动赋予可执行权限)

首先查看文件权限

ls -l /home/set_led.sh

如果没有可执行权限修改权限

chmod +x /home/set_led.sh

以上就是这个问题的全部内容啦,不得不说QT的水是真的深,年少不知QT好,还有很多其他的功能有待学习与应用。


http://www.mrgr.cn/news/7959.html

相关文章:

  • Java nio pipe 相似的 api
  • 依靠 VPN 生存——探索 VPN 后利用技术
  • python绘制爱心代码
  • 如何从单点到集群配置Eureka:最佳实践与配置详解
  • 【区块链 + 智慧文旅】鲜檬内容生态平台 | FISCO BCOS应用案例
  • Java 开发中常用的Linux 性能调优技巧
  • Centos LVM磁盘合并方法
  • MyBatis使用:拦截器
  • 【Linux多线程】线程安全的单例模式
  • iis部署服务时,发现只能进行get请求,无法发起post、put请求
  • 机器学习-OpenCV运用(1)
  • 探索数据结构:图(三)之最短路径算法
  • fastap之使用 contextvars 实现上下文变量
  • 前端面试宝典【设计模式】【4】
  • Netty代码阅读
  • 依赖包更新了但是没有release,如何安装更新的依赖包
  • 链表OJ题——相交链表
  • 电脑ip地址为什么会自己变更?电脑ip怎么改
  • python socket 发生UDP 和 UDPServer接受UDP实例
  • 二叉树的介绍