【发布时间】:2021-02-07 15:55:15
【问题描述】:
我想编写一个简单的应用程序(即启动程序)来启动我的主应用程序并进一步监控其状态并在它崩溃/退出时重新启动它。
它非常简单。为此,我使用QProcess 并运行主应用程序(app1)并处理其stateChanged 信号。
为了测试它,我编写了一个非常小的控制台应用程序,它会打印出它的名称,然后通过exit(-1) 返回(模拟程序由于某种原因退出的情况)。
一切都第一次按预期进行,stateChanged 信号在每个阶段都会发出。 App1 将在启动后立即退出,再次导致第二次发出 staeChanged 信号。
问题是在 APP1 第二次启动(并因此退出)后,stateChanged 信号不再发出!!!
我做错了什么?每次我通过 QProcess 启动应用程序时,我是否应该重新连接信号或 ...???
注意:我在 windows 和 linux 下都看到了这种情况。
starter::starter(QObject *parent) : QObject(parent)
{
m_process = new QProcess(this);
m_process->setProcessChannelMode(QProcess::ProcessChannelMode::ForwardedChannels);
connect(m_process, &QProcess::stateChanged, this, &starter::onStateChanged);
m_process->setProgram("myapp1");
m_process->setArguments(QStringList());
startProcess();
}
void starter::onStateChanged(const QProcess::ProcessState &state)
{
qDebug() << "state changed to : " << state;
if(state == QProcess::ProcessState::NotRunning){
this->startProcess();
}
}
void starter::startProcess()
{
qDebug() << "start process App1";
m_process->start();
if(m_process->waitForStarted(1000)){
qDebug() << "[+] App started";
}
else{
qDebug() << "[!] Failed to start app";
}
}
输出:
C:\myapp1-release>starter.exe
start process : "myapp1"
state changed to : QProcess::Starting
state changed to : QProcess::Running
[+] App started
state changed to : QProcess::NotRunning
start process : "myapp1"
state changed to : QProcess::Starting
state changed to : QProcess::Running
[+] App started
*NO FURTHER REACTION TO THE EXIT OF APP1*
【问题讨论】:
-
删除
waitForStarted -
我删除了
waitForStarted并没有帮助。同样的问题仍然存在(app1 仅发出 2 次信号)。 -
在“m_process->terminate();”结束时终止进程
-
“结束”是什么意思?当检测到应用程序未运行时,我将
m_process->terminate()置于onStateChanged。但这并没有帮助。我的真实程序在 2 个应用程序之间切换(根据用户请求)并为此使用terminate()。在这种情况下,我没有问题,每次关闭应用程序时都会收到信号)。 当应用程序被手动终止或自行崩溃/退出时会出现问题。 -
进一步观察:如果我让样本“myapp1”不退出并阻止
app.exec(),而是手动杀死它(例如kill -9 pid),则会观察到相同的问题(即@987654335 @信号仅在第一次手动杀死app1时发出)