在析构函数中终止QProcess

时间:2018-05-04 10:18:40

标签: qt qprocess

尝试在其父级析构函数中停止QProcess时出现问题。这是我的代码:

AbstractProcess::~AbstractProcess()
{
    if((m_process->state() == QProcess::Running)
       || (m_process->state() == QProcess::Starting))
    {
        m_process->terminate();
        m_process->waitForFinished();
    }
}

m_process是指向QProcess的指针。在AbstractProcess的构造函数中,我有以下代码:

 m_process = new QProcess(this);

所以,当删除AbstractProcess时,我会找到它的析构函数,并且我遇到了分段错误:

m_process->waitForFinished();

有谁能告诉我我的错误是什么?

UPD : 正如下面评论中所述,问题不在我提供的代码中。很抱歉。所以我会尝试解释问题所在。也许它会对某人有所帮助。你可能会猜到AbstractProcess是一个抽象类。所以它有一些纯虚函数。他们是:

virtual void onProcessFinished(int exitCode, QProcess::ExitStatus
exitStatus) = 0;

我的构造函数的完整主体是:

m_process = new QProcess(this);
connect(m_process,static_cast<void(QProcess::*)(int,QProcess::ExitStatus)>(&QProcess::finished),
        this, &AbstractProcess::onProcessFinished);

现在显而易见的是,在调用waitForFinished时,进程会发出信号finished并调用纯虚函数。这导致了不确定的行为。要解决此问题,请在停止我的流程之前致电disconnect。析构函数现在看起来像这样:

AbstractProcess::~AbstractProcess()
{
    disconnect(m_process,static_cast<void(QProcess::*)(int,QProcess::ExitStatus)>(&QProcess::finished),
               this, &AbstractProcess::onProcessFinished)        
    if((m_process->state() == QProcess::Running)
       || (m_process->state() == QProcess::Starting))
    {
        m_process->terminate();
        m_process->waitForFinished();
    }
}

感谢大家的帮助。

1 个答案:

答案 0 :(得分:-1)

当您首先致电m_process->terminate();时,无法保证流程退出 ..但无法保证流程将继续存在因为在Linux上调用(WM_CLOSE on Windows / SIGTERM)所以在可能已经终止的进程上调用m_process->waitForFinished();可能会导致分段错误。 正确和安全的方法是按顺序做正确的事情:

  m_process->waitForFinished();
  m_process->terminate();