【问题标题】:QProcess stateChanged signal not emitted correctlyQProcess stateChanged 信号未正确发出
【发布时间】: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-&gt;terminate() 置于onStateChanged。但这并没有帮助。我的真实程序在 2 个应用程序之间切换(根据用户请求)并为此使用 terminate()。在这种情况下,我没有问题,每次关闭应用程序时都会收到信号)。 当应用程序被手动终止或自行崩溃/退出时会出现问题。
  • 进一步观察:如果我让样本“myapp1”不退出并阻止app.exec(),而是手动杀死它(例如kill -9 pid),则会观察到相同的问题(即@987654335 @信号仅在第一次手动杀死app1时发出)

标签: qt qprocess


【解决方案1】:

我的(不太好的)解决方案: 当我检测到应用程序崩溃/退出时,我删除旧的 QProcess 对象并再次实例化它。

这样,所有其他和随之而来的应用程序崩溃/退出都会发出信号。

m_process->deleteLater();//delete the old instance - I hope its signal/slot connections are cleared automatically by Qt ??!!
m_process = new QProcess(this);
m_process->setProcessChannelMode(QProcess::ProcessChannelMode::ForwardedChannels);
connect(m_process, &QProcess::stateChanged, this, &starter::onStateChanged);//make connections for the new instance

采用这种方法的提示来自 Qt 的 QProcess::close() 文档:

关闭与进程的所有通信并终止它。 之后 调用此函数,QProcess 将不再发出 readyRead(),并且 无法再读取或写入数据。

Qt 的文档有没有提到如果 qprocess 应用程序退出或被手动杀死,stateChanged 信号将不再发出?或者可能我错过了什么。

非常感谢您对这种方法的正确性提出任何评论。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-10
    • 1970-01-01
    • 2016-07-30
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多