|
|
|
|
@ -85,6 +85,7 @@
|
|
|
|
|
#include "nmWxParaPropertyPebi.h"
|
|
|
|
|
#include "nmWxNumericalDesign.h"
|
|
|
|
|
#include "nmWxSensitive.h"
|
|
|
|
|
#include "nmWxForecast.h"
|
|
|
|
|
|
|
|
|
|
#include "nmWxReservoirProperties.h"
|
|
|
|
|
|
|
|
|
|
@ -257,13 +258,13 @@ nmSubWndMain::~nmSubWndMain()
|
|
|
|
|
s_pPendingSolverWindow = nullptr;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 批量任务由敏感性窗口释放;主窗口销毁前先解除回调并等待停止。
|
|
|
|
|
if(!m_pSensitivityTask.isNull()) {
|
|
|
|
|
disconnect(m_pSensitivityTask.data(), nullptr, this, nullptr);
|
|
|
|
|
m_pSensitivityTask->requestCancel();
|
|
|
|
|
m_pSensitivityTask->wait();
|
|
|
|
|
if(s_pRunningSolverTask == m_pSensitivityTask) s_pRunningSolverTask = nullptr;
|
|
|
|
|
m_pSensitivityTask = nullptr;
|
|
|
|
|
// 敏感性和预测任务由参数窗口释放;主窗口销毁前先解除回调并等待停止。
|
|
|
|
|
if(!m_pAuxiliarySolverTask.isNull()) {
|
|
|
|
|
disconnect(m_pAuxiliarySolverTask.data(), nullptr, this, nullptr);
|
|
|
|
|
m_pAuxiliarySolverTask->requestCancel();
|
|
|
|
|
m_pAuxiliarySolverTask->wait();
|
|
|
|
|
if(s_pRunningSolverTask == m_pAuxiliarySolverTask) s_pRunningSolverTask = nullptr;
|
|
|
|
|
m_pAuxiliarySolverTask = nullptr;
|
|
|
|
|
}
|
|
|
|
|
if (m_pProgressDlg) {
|
|
|
|
|
delete m_pProgressDlg;
|
|
|
|
|
@ -1846,22 +1847,41 @@ void nmSubWndMain::showSolverProgress()
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void nmSubWndMain::onSensitivityTaskReady(
|
|
|
|
|
nmWxSensitive* dialog, nmCalculationDllPebiSolverTask* task)
|
|
|
|
|
bool nmSubWndMain::prepareAuxiliarySolverTask(
|
|
|
|
|
QWidget* dialog, nmCalculationDllPebiSolverTask* task)
|
|
|
|
|
{
|
|
|
|
|
// 与普通求解共用防重入状态,避免两个任务同时写同一进度框。
|
|
|
|
|
if(!s_pPendingSolverWindow.isNull() || !s_pRunningSolverTask.isNull() ||
|
|
|
|
|
m_bSolverResultCompletionPending) {
|
|
|
|
|
QMessageBox::information(dialog, tr("solver error"), tr("task is running!"));
|
|
|
|
|
return;
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
m_pSensitivityTask = task;
|
|
|
|
|
m_pAuxiliarySolverTask = task;
|
|
|
|
|
s_pRunningSolverTask = task;
|
|
|
|
|
m_bSolverCancelRequested = false;
|
|
|
|
|
// 整个批次保持同一个滚动进度,不订阅每组求解的阶段刷新信号。
|
|
|
|
|
// 先隐藏共享进度框,再让参数窗口的完成槽读取结果。
|
|
|
|
|
connect(task, SIGNAL(finished()), this, SLOT(onSensitivityTaskFinished()), Qt::QueuedConnection);
|
|
|
|
|
connect(task, SIGNAL(destroyed(QObject*)), this, SLOT(onSensitivityTaskDestroyed()));
|
|
|
|
|
connect(task, SIGNAL(finished()), this, SLOT(onAuxiliarySolverTaskFinished()), Qt::QueuedConnection);
|
|
|
|
|
connect(task, SIGNAL(destroyed(QObject*)), this, SLOT(onAuxiliarySolverTaskDestroyed()));
|
|
|
|
|
showSolverProgress();
|
|
|
|
|
m_pProgressDlg->setLabelText(nmCalculationDllPebiSolverTask::tr("Solving model..."));
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void nmSubWndMain::onForecastTaskReady(
|
|
|
|
|
nmWxForecast* dialog, nmCalculationDllPebiSolverTask* task)
|
|
|
|
|
{
|
|
|
|
|
// 预测沿用共享进度框和停止路径,计算结果不进入正式成果提交。
|
|
|
|
|
if(!prepareAuxiliarySolverTask(dialog, task)) return;
|
|
|
|
|
connect(dialog, SIGNAL(sigForecastCancelRequested()),
|
|
|
|
|
this, SLOT(onSolverCancelRequested()), Qt::UniqueConnection);
|
|
|
|
|
dialog->startForecastCalculation();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void nmSubWndMain::onSensitivityTaskReady(
|
|
|
|
|
nmWxSensitive* dialog, nmCalculationDllPebiSolverTask* task)
|
|
|
|
|
{
|
|
|
|
|
// 整个批次保持同一个滚动进度,不订阅每组求解的阶段刷新信号。
|
|
|
|
|
if(!prepareAuxiliarySolverTask(dialog, task)) return;
|
|
|
|
|
connect(dialog, SIGNAL(sigSensitivityCancelRequested()),
|
|
|
|
|
this, SLOT(onSolverCancelRequested()), Qt::UniqueConnection);
|
|
|
|
|
// 坐标标题与单位跟随求解时的双对数窗口,后来切换模型不改变已有批次。
|
|
|
|
|
@ -1876,27 +1896,25 @@ void nmSubWndMain::onSensitivityTaskReady(
|
|
|
|
|
result->m_sAxisYUnit = source->getAxisOf(1)->getUnit();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
showSolverProgress();
|
|
|
|
|
m_pProgressDlg->setLabelText(nmCalculationDllPebiSolverTask::tr("Solving model..."));
|
|
|
|
|
dialog->startSensitivityCalculation();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void nmSubWndMain::onSensitivityTaskFinished()
|
|
|
|
|
void nmSubWndMain::onAuxiliarySolverTaskFinished()
|
|
|
|
|
{
|
|
|
|
|
// 完整退出线程后再释放进度框的占用,不进入普通求解的成果提交路径。
|
|
|
|
|
if(m_pSensitivityTask.isNull() || sender() != m_pSensitivityTask.data()) return;
|
|
|
|
|
m_pSensitivityTask->wait();
|
|
|
|
|
if(s_pRunningSolverTask == m_pSensitivityTask) s_pRunningSolverTask = nullptr;
|
|
|
|
|
disconnect(m_pSensitivityTask.data(), nullptr, this, nullptr);
|
|
|
|
|
m_pSensitivityTask = nullptr;
|
|
|
|
|
if(m_pAuxiliarySolverTask.isNull() || sender() != m_pAuxiliarySolverTask.data()) return;
|
|
|
|
|
m_pAuxiliarySolverTask->wait();
|
|
|
|
|
if(s_pRunningSolverTask == m_pAuxiliarySolverTask) s_pRunningSolverTask = nullptr;
|
|
|
|
|
disconnect(m_pAuxiliarySolverTask.data(), nullptr, this, nullptr);
|
|
|
|
|
m_pAuxiliarySolverTask = nullptr;
|
|
|
|
|
m_bSolverCancelRequested = false;
|
|
|
|
|
m_pProgressDlg->hide();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void nmSubWndMain::onSensitivityTaskDestroyed()
|
|
|
|
|
void nmSubWndMain::onAuxiliarySolverTaskDestroyed()
|
|
|
|
|
{
|
|
|
|
|
// 参数面板提前销毁时,其析构函数已等待任务结束,解除共享进度框占用。
|
|
|
|
|
m_pSensitivityTask = nullptr;
|
|
|
|
|
m_pAuxiliarySolverTask = nullptr;
|
|
|
|
|
m_bSolverCancelRequested = false;
|
|
|
|
|
m_pProgressDlg->hide();
|
|
|
|
|
}
|
|
|
|
|
@ -2722,8 +2740,8 @@ void nmSubWndMain::onSolverCancelRequested()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 共享停止按钮只控制当前占用进度框的任务,DLL 返回后的处理各自保持原路径。
|
|
|
|
|
nmCalculationDllPebiSolverTask* pRunningTask = !m_pSensitivityTask.isNull()
|
|
|
|
|
? m_pSensitivityTask.data() : m_pSolverTask;
|
|
|
|
|
nmCalculationDllPebiSolverTask* pRunningTask = !m_pAuxiliarySolverTask.isNull()
|
|
|
|
|
? m_pAuxiliarySolverTask.data() : m_pSolverTask;
|
|
|
|
|
if(pRunningTask != nullptr && pRunningTask->isRunning()) {
|
|
|
|
|
m_bSolverCancelRequested = true;
|
|
|
|
|
pRunningTask->requestCancel();
|
|
|
|
|
@ -3126,7 +3144,7 @@ bool nmSubWndMain::onConfirmClosing()
|
|
|
|
|
{
|
|
|
|
|
// 正常关闭入口在求解结束前保持当前成果和 DataManager 存活;应用退出等绕过
|
|
|
|
|
// 该确认流程的路径仍由析构函数 wait() 兜底。
|
|
|
|
|
if(m_bSolverStartPending || !m_pSensitivityTask.isNull() ||
|
|
|
|
|
if(m_bSolverStartPending || !m_pAuxiliarySolverTask.isNull() ||
|
|
|
|
|
(m_pSolverTask != nullptr && m_pSolverTask->isRunning())) {
|
|
|
|
|
QMessageBox::information(this, tr("solver error"), tr("task is running!"));
|
|
|
|
|
return false;
|
|
|
|
|
|