【发布时间】:2020-09-24 01:47:45
【问题描述】:
我一直在努力研究如何使用QProcess 执行多个进程。我能够执行单个进程,即打开终端窗口QProcess *openTerminal = new QProcess(this);,之后我想执行其他进程,但我找不到这样做的方法。我试图实现的操作顺序是:
1) 打开一个 gnome 终端(这个问题已经解决,可以在 QPushButtonclick 之后打开)
2) 导航到cd ~
3) 转到首选目录cd catkin_docking_ws/
4) 启动正确的应用程序roslaunch lidar_deck lidar_deck_rosbag.launch &
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
startLidar();
}
void MainWindow::startLidar()
{
// Execution of the QProcess to make sure Lidar App Launcher opens:
this->executeROSLidarApp = new QProcess(this);
this->executeROSLidarApp->setProcessChannelMode(QProcess::MergedChannels);
connect(this->executeROSLidarApp, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished),
[script = this->executeROSLidarApp](int exitCode, QProcess::ExitStatus exitStatus){
qDebug() << "[EXEC] FINISHED: " << exitCode << exitStatus;
if(script->bytesAvailable() > 0) qDebug() << "[EXEC] buffered DATA:" << script->readAll();
});
connect(this->executeROSLidarApp, &QProcess::errorOccurred, [script = this->executeROSLidarApp](QProcess::ProcessError error) {
qDebug() << "[EXEC] error on execution: " << error << script->errorString();
});
}
void MainWindow::on_launchLidarROSBtn_clicked()
{
qDebug() << "Launching LIDAR APP";
QProcess *openTerminal = new QProcess(this);
QProcess *cd = new QProcess(this);
QProcess *cd_catkin = new QProcess(this);
QProcess *roslaunch = new QProcess(this);
openTerminal->start("gnome-terminal");
openTerminal->waitForFinished();
cd->start("cd ~", QStringList() << "cd ~");
cd->waitForFinished();
cd_catkin->start("cd catkin_docking_ws/", QStringList() << "cd catkin_docking_ws/");
cd_catkin->waitForFinished();
roslaunch->start("roslaunch lidar_deck lidar_deck_rosbag.launch &", QStringList() << "roslaunch lidar_deck lidar_deck_rosbag.launch &");
roslaunch->waitForFinished();
}
为了解决这个问题,我查阅了很多资源,例如this one,我也使用过this,this post。但是它们似乎都提供了令人困惑的信息,并且正在寻找一个干净简单的过程。
我还对解决方案进行了更多研究,this post 建议选择detachedProcess,但我不确定这是一个好主意,因为this post 似乎遵循了一个非常有条理的结构。
我想要达到的最终结果是this,但当然,通过了我上面的所有四个QProcess。
这是可能的还是我试图处理太多的进程? 非常感谢您指出解决此问题的正确方向。
【问题讨论】:
-
1) 为什么需要执行多个进程? 2)那些进程会依次执行,?,即进程1结束后会执行进程2。
-
@eyllanesc,感谢您阅读问题。回答您的问题:1)因为这是我现在想到的最好的主意,但我愿意接受更简单/更快的解决方案,2)“流程 2 将在流程 1 之后执行”好的,但是另一个呢进程?
-
这只是问题所在:我不明白你的基本目标,因为在你的问题中你没有指出它,但你在 best idea 中占据了整个帖子,为什么你不使用单个 QProcess 吗?,
QProcess process;在 .h 中并添加process.start("roslaunch" {"~/catkin_docking_ws/lidar_deck lidar_deck_rosbag.launch"});。注意:每个进程相互独立,QProcess 不是终端。还有为什么要使用 gnome-terminal?