我一直在苦恼如何使用以下方法执行多个进程 QProcess
. 我能够执行一个单一的进程,即打开一个终端窗口。QProcess *openTerminal = new QProcess(this);
之后,我想执行更多的进程,但我找不到办法。我想实现的操作顺序是。
1) 打开一个gnome-terminal(这个问题已经解决了,并且能够在打开gnome-terminal之后打开 QPushButton
点击)
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();
}
为了解决这个问题,我查阅了很多资料,如 这个我还用了 这个, 此职位. 但所有的人似乎都给出了混乱的信息,正在寻找一个干净和简单的过程。
此外,我还深入研究了解决方案和 此职位 建议去 detachedProcess
但我不确定这是不是一个好主意,因为 此职位 似乎遵循一个相当有组织的结构。
我想达到的最终结果是 这个 但是,当然,通过所有的四个。QProcess
我有上面的。
是可能的,还是我试图总共处理太多的进程?非常感谢你指出解决这个问题的正确方向。
每个QProcess代表一个新的会话,所以不能使用多个QProcess对象来执行一个序列。最好的方法是创建一个shell脚本,做你想做的事情,然后使用一个QProcess实例来执行该脚本。