Qt中调用system()和QProcess执行命令行,更改树莓派的系统时间

最近给vivo做的设备需要连接MES生产内网,要求机器根据心跳包返回值来同步服务器时间。而这一步操作需要在上位机程序中执行,也就是在Qt中调用命令行或者更改配置文件来设置系统时间。
树莓派更改系统时间的方法很多,在这里我介绍两种比较方便的:

① 使用命令行:sudo date --s=“2020-11-28 14:30:00”

② 编写shell脚本,通过调用shell脚本执行命令行。
新建"systime.sh"脚本,在脚本中写入:

#! bin/bash
sudo date --s="2020-11-28 14:30:00"
exit 0
// exit 0表示脚本下执行完后自动关闭脚本文件

Qt中如何使用这两种方法来实现通过程序更改系统时间呢,在网上搜索后找到了如下两种方法:

① 使用Linux中的system()函数,这个函数需要引用stdlib.h头文件。在system函数中写入字符串形式的命令行,即可执行对应的终端命令,比如system(“sudo reboot”),那么树莓派就会重新启动。或者通过命令行运行脚本system(“systime.sh”)就会运行systime.sh脚本,然后执行脚本里的内容。
但是如果使用system的方式更改系统时间会有一个问题,因为是根据服务器心跳包的返回值来更改系统时间,这里的时间实际上是一个变量,需要当做参数传入,根据参数来更改时间。如果多次调用system来更改时间,会发现只有第一次的system(命令行)是生效的,之后每一次调用system所执行的都是第一次调用的命令。造成这种情况的原因我无法解释,我的猜想是因为system函数创造的进程没有释放,所以每次调用system()都执行的同一个进程。显然这样是无法满足根据心跳包同步服务器时间的要求的。

② 使用QProcess类,Qt中的QProcess类提供了启动外部程序的方法。
通过start()函数来调用外接程序,或调用命令行,而且也可以手动释放,这样就不存在上述system函数的问题了。

#include <QProcess>
QProcess process;
process.start("sudo date --s=\"2020-11-28 14:30:00\"");
//process.start("systime.sh");
process.waitForStarted();
process.waitForFinished();//以阻塞的方式等待释放
  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在QT界面调用OpenFoam的命令行工具,可以使用QTQProcess类。该类允许在QT应用程序启动外部进程,并与其交互。 以下是一个简单的示例代码,演示如何使用QProcessQT界面调用OpenFoam的命令行工具并将输出显示在QT界面: ```cpp #include <QProcess> #include <QTextEdit> // 在QT界面调用OpenFoam命令行工具,并将输出显示在QT界面的文本编辑器 void runOpenFoamCommand(const QString& command, QTextEdit* outputWidget) { // 创建一个QProcess对象,并设置命令行参数 QProcess* process = new QProcess(); process->setProgram("bash"); QStringList arguments; arguments << "-c" << command; process->setArguments(arguments); // 设置QProcess的一些参数,例如启动目录、环境变量等 process->setWorkingDirectory("/path/to/OpenFoam/"); QProcessEnvironment environment = QProcessEnvironment::systemEnvironment(); environment.insert("FOAM_INST_DIR", "/path/to/OpenFoam/"); process->setProcessEnvironment(environment); // 将QProcess的标准输出和错误输出连接到槽函数,以便在QT界面显示输出 QObject::connect(process, &QProcess::readyReadStandardOutput, [=]() { outputWidget->append(process->readAllStandardOutput()); }); QObject::connect(process, &QProcess::readyReadStandardError, [=]() { outputWidget->append(process->readAllStandardError()); }); // 启动QProcess,并等待它完成 process->start(); process->waitForFinished(); // 释放QProcess对象 delete process; } ``` 在上面的代码,runOpenFoamCommand函数接受两个参数:要执行的OpenFoam命令和一个QTextEdit对象,用于显示命令的输出。在函数,我们首先创建一个QProcess对象,并设置其命令行参数。然后,我们设置QProcess的一些其他参数,例如启动目录和环境变量。接下来,我们将QProcess的标准输出和错误输出连接到lambda函数,该函数将输出添加到QT界面的文本编辑器。最后,我们启动QProcess,并等待它完成,然后释放QProcess对象。 要调用此函数,只需在QT界面调用它,并传递要执行的OpenFoam命令和要显示输出的QTextEdit对象。例如: ```cpp QTextEdit* outputWidget = new QTextEdit(); runOpenFoamCommand("foamListTimes -case /path/to/OpenFoam/case", outputWidget); ``` 在上面的代码,我们创建一个QTextEdit对象,用于显示OpenFoam命令的输出。然后,我们调用runOpenFoamCommand函数,并传递要执行的命令和输出窗口小部件。函数将在QT界面启动OpenFoam命令,并将输出显示在QTextEdit对象

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值