gpt4 book ai didi

qt - 在析构函数中终止 QProcess

转载 作者:行者123 更新时间:2023-12-03 18:01:49 27 4
gpt4 key购买 nike

A 在尝试阻止我的 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();

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

更新 :
正如下面评论中所说,问题不在我提供的代码中。对此非常抱歉。因此,我将尝试解释问题所在。也许它会帮助某人。 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();
}
}

谢谢大家的帮助。

最佳答案

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

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

关于qt - 在析构函数中终止 QProcess,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50172609/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com