作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
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/
我是一名优秀的程序员,十分优秀!