fix(nmNum): 移除网格数量统计并居中显示求解耗时

(cherry picked from commit 9ba4f2e0cc)
develop
lvjunjie 2 days ago
parent 921c41dc02
commit 87641c3bc6

Binary file not shown.

@ -3551,10 +3551,8 @@ No valid error was returned; keep the last accepted result and reduce the step.<
<translation>求解已完成且结果已提交,但无法打开结果窗口。</translation>
</message>
<message>
<source>Grid count: %1
Solve time: %2 ms</source>
<translation>网格数量:%1
本次求解耗时:%2 ms</translation>
<source>Solve time: %1 ms</source>
<translation>本次求解耗时:%1 ms</translation>
</message>
</context>
<context>

@ -48,8 +48,6 @@ class NMCALCULATION_EXPORT nmCalculationDllPebiSolverTask : public QThread {
bool wasSuccessful() const;
/** @brief 获取本次DLL内部求解耗时,单位为毫秒。 */
int getSolveTimeMs() const;
/** @brief 获取本次求解的PEBI网格数量。 */
int getPebiCount() const;
/** @brief 返回当前代码已识别的失败原因;成功或主动停止时为空。 */
QString getFailureReason() const;
/** @brief 请求协作式停止;DLL 正在执行时会在返回后丢弃结果。 */
@ -138,8 +136,6 @@ class NMCALCULATION_EXPORT nmCalculationDllPebiSolverTask : public QThread {
bool m_lastRunSucceeded; ///< run() 保存的执行状态,供等待线程安全读取。
/** @brief 本次DLL内部求解耗时,单位为毫秒。 */
int m_nSolveTimeMs;
/** @brief 本次求解的PEBI网格数量。 */
int m_nPebiCount;
QString m_sFailureReason; ///< 当前代码已识别的首个失败原因。
QString m_sAutoFitTargetWellCode; ///< 自动拟合目标井 WellCode;空值表示保存完整结果。
QVector<QVector<double> > m_autoFitResultPressure; ///< 目标井原始压力结果。

@ -113,7 +113,6 @@ struct nmPebiGridResult
/** @brief 创建空结果;只有 m_bSucceeded 为 true 时才允许提交。 */
nmPebiGridResult()
: m_pUnstructuredGrid(nullptr),
m_nPebiCount(-1),
m_bSucceeded(false)
{
}
@ -121,7 +120,6 @@ struct nmPebiGridResult
HX_NWTM_GRID_OUTPUT1 m_oGridOutput1; ///< 网格 DLL 主输出。
HX_NWTM_GRID_OUTPUT2 m_oGridOutput2; ///< 网格 DLL 辅助输出。
vtkSmartPointer<vtkUnstructuredGrid> m_pUnstructuredGrid; ///< 局部构造的 VTK 网格。
int m_nPebiCount; ///< DLL 返回的 PEBI 单元数量。
bool m_bSucceeded; ///< DLL 和 VTK 转换是否全部成功。
};
@ -209,7 +207,6 @@ public:
quint64 nGridInputRevision,
HX_NWTM_GRID_OUTPUT1& oGridOutput1,
HX_NWTM_GRID_OUTPUT2& oGridOutput2,
int& nPebiCount,
const QAtomicInt* pCancelRequested = NULL) const;
/** @brief 主线程快速判断缓存归属和版本,不复制大型 DLL 输出。 */
bool isCurrentGridAvailableFor(const nmDataAnalyzeManager* pDataManager,
@ -220,8 +217,6 @@ public:
HX_NWTM_GRID_OUTPUT1 getGridOutput1();
/** @brief 在线程锁保护下返回最近一次网格输出 p2 的副本。 */
HX_NWTM_GRID_OUTPUT2 getGridOutput2();
/** @brief 返回最近一次网格划分生成的 PEBI 单元数量。 */
int getPebiCount() const;
private:
static nmCalculationPebiGrid* m_instance; ///< 进程内共享的 PEBI 网格服务实例。
@ -229,7 +224,6 @@ private:
HX_NWTM_GRID_OUTPUT1 p1; ///< 最近一次网格 DLL 主输出。
HX_NWTM_GRID_OUTPUT2 p2; ///< 最近一次网格 DLL 辅助输出。
double m_dGridControl; ///< 对应 HX_NWTM_GRID_INPUT::GridControl。
int m_nPebiCount; ///< 最近一次成功网格的单元数量,未生成时为 -1。
quint64 m_nCachedGridInputRevision; ///< 单例 DLL 输出对应的网格输入版本。
/** @brief 当前单例缓存所属的数据管理器,不拥有对象。 */
nmDataAnalyzeManager* m_pDataManager;

@ -255,11 +255,9 @@ class NM_SUB_WND_EXPORT nmSubWndMain : public iSubWndBaseFit {
void schedulePendingResultWidgets();
// 根据结果页面是否准备成功显示本次求解的最终提示。
void showSolverResultCompletion(bool bResultWindowReady,
int nPebiCount,
int nSolveTimeMs);
// 先隐藏求解进度框,再排队处理结果界面。
void scheduleSolverResultCompletion(bool bSucceeded,
int nPebiCount,
int nSolveTimeMs,
bool bInputChanged,
const QString& sFailureReason);
@ -312,13 +310,11 @@ private:
bool m_bPendingResultWidgetRefresh; ///< 正在等待下一轮事件填充首次结果页面。
bool m_bPendingResultCompletionMessage; ///< 首次页面填充后再显示求解结果提示。
bool m_bPendingResultWindowReady; ///< 延迟填充是否成功创建全部结果页面。
int m_nPendingResultPebiCount; ///< 延迟提示所需的网格数量。
int m_nPendingResultSolveTimeMs; ///< 延迟提示所需的求解耗时。
bool m_bSolverResultCompletionPending; ///< 等待进度框隐藏后处理求解结果。
bool m_bPendingSolverSucceeded; ///< 待处理求解结果是否成功。
bool m_bPendingSolverInputChanged; ///< 输入变化导致本次旧结果被丢弃。
QString m_sPendingSolverFailureReason; ///< 当前代码已识别的待显示失败原因。
int m_nPendingSolverPebiCount; ///< 待显示的网格数量。
int m_nPendingSolverTimeMs; ///< 待显示的求解耗时。
bool m_bSolverStartPending; ///< 进度框已显示,输入正分批捕获或任务等待启动。
bool m_bSolverCancelRequested; ///< 已向当前任务发送停止请求,忽略后续阶段信号。

@ -618,7 +618,6 @@ nmCalculationDllPebiSolverTask::nmCalculationDllPebiSolverTask(
m_nResultInputRevision(0),
m_lastRunSucceeded(false),
m_nSolveTimeMs(-1),
m_nPebiCount(-1),
m_dPendingScalarMin(0.0),
m_dPendingScalarMax(0.0),
m_bPendingFullResultReady(false),
@ -671,7 +670,6 @@ nmCalculationDllPebiSolverTask::~nmCalculationDllPebiSolverTask()
void nmCalculationDllPebiSolverTask::run()
{
m_nSolveTimeMs = -1;
m_nPebiCount = -1;
bool bSucceeded = false;
try {
bSucceeded = this->execute();
@ -1107,15 +1105,12 @@ bool nmCalculationDllPebiSolverTask::captureInputSnapshot(
m_pInputSnapshot->m_bMayUseCachedGrid) {
HX_NWTM_GRID_OUTPUT1 oGridOutput1;
HX_NWTM_GRID_OUTPUT2 oGridOutput2;
int nPebiCount = -1;
if(pGridService->copyCurrentGridFor(m_pDataManager,
m_nGridInputRevision,
oGridOutput1,
oGridOutput2,
nPebiCount)) {
oGridOutput2)) {
m_pInputSnapshot->m_oGridResult.m_oGridOutput1 = oGridOutput1;
m_pInputSnapshot->m_oGridResult.m_oGridOutput2 = oGridOutput2;
m_pInputSnapshot->m_oGridResult.m_nPebiCount = nPebiCount;
m_pInputSnapshot->m_oGridResult.m_bSucceeded = true;
} else {
m_pInputSnapshot->m_bRequiresGridCalculation = true;
@ -1159,7 +1154,6 @@ bool nmCalculationDllPebiSolverTask::prepareManualInput()
m_nGridInputRevision,
oGridResult.m_oGridOutput1,
oGridResult.m_oGridOutput2,
oGridResult.m_nPebiCount,
&m_nCancelRequested)) {
oGridResult.m_bSucceeded = true;
@ -1199,11 +1193,6 @@ int nmCalculationDllPebiSolverTask::getSolveTimeMs() const
return m_nSolveTimeMs;
}
int nmCalculationDllPebiSolverTask::getPebiCount() const
{
return m_nPebiCount;
}
QString nmCalculationDllPebiSolverTask::getFailureReason() const
{
return m_sFailureReason;
@ -1419,7 +1408,6 @@ bool nmCalculationDllPebiSolverTask::execPebiMode()
oModelInput,
m_pInputSnapshot->m_oGridInput.m_sLicensePath
.toStdString());
m_nPebiCount = oGridResult.m_nPebiCount;
m_nSolveTimeMs = pfnGetSolveTime();
} catch(const std::exception& e) {
qWarning() << QString("C++ Exception during HX_NWTM_MODEL call: %1")

@ -287,8 +287,7 @@ nmCalculationPebiGrid* nmCalculationPebiGrid::getInstance()
}
nmCalculationPebiGrid::nmCalculationPebiGrid()
: m_nPebiCount(-1),
m_nCachedGridInputRevision(0),
: m_nCachedGridInputRevision(0),
m_pDataManager(nullptr)
{
// 默认值来自HX_NWTM_GRID_INPUT构造函数
@ -343,7 +342,6 @@ void nmCalculationPebiGrid::clearGridData(
p1 = HX_NWTM_GRID_OUTPUT1();
p2 = HX_NWTM_GRID_OUTPUT2();
m_dGridControl = p0.GridControl;
m_nPebiCount = -1;
m_nCachedGridInputRevision = 0;
m_pDataManager = nullptr;
}
@ -353,7 +351,6 @@ bool nmCalculationPebiGrid::copyCurrentGridFor(
quint64 nGridInputRevision,
HX_NWTM_GRID_OUTPUT1& oGridOutput1,
HX_NWTM_GRID_OUTPUT2& oGridOutput2,
int& nPebiCount,
const QAtomicInt* pCancelRequested) const
{
nmInterruptibleMutexLocker oGridLocker;
@ -378,7 +375,6 @@ bool nmCalculationPebiGrid::copyCurrentGridFor(
return false;
}
oGridOutput2 = p2;
nPebiCount = m_nPebiCount;
return true;
}
@ -927,12 +923,6 @@ HX_NWTM_GRID_OUTPUT2 nmCalculationPebiGrid::getGridOutput2()
return p2;
}
int nmCalculationPebiGrid::getPebiCount() const
{
QMutexLocker oLocker(&s_oPebiGridMutex);
return m_nPebiCount;
}
vtkSmartPointer<vtkUnstructuredGrid> nmCalculationPebiGrid::createPebiUnstructuredGrid(
const HX_NWTM_GRID_OUTPUT1& P1,
const QAtomicInt* pCancelRequested)
@ -1862,15 +1852,10 @@ bool nmCalculationPebiGrid::calculateSnapshot(
return false;
}
typedef int (*GetIntValueFunc)();
HX_NWTM_GRID_Func pfnGenerateGrid =
reinterpret_cast<HX_NWTM_GRID_Func>(
GetProcAddress(hGridModule, "HX_NWTM_GRID"));
GetIntValueFunc pfnGetPebiCount =
reinterpret_cast<GetIntValueFunc>(
GetProcAddress(hGridModule, "getPEBInum"));
if(pfnGenerateGrid == nullptr || pfnGetPebiCount == nullptr) {
if(pfnGenerateGrid == nullptr) {
qWarning() << "Failed to resolve HX_NWTM grid functions. Error code:"
<< GetLastError();
FreeLibrary(hGridModule);
@ -1892,7 +1877,6 @@ bool nmCalculationPebiGrid::calculateSnapshot(
return false;
}
nmCalculationUtils::cleanupPebiGridDebugFiles();
oResult.m_nPebiCount = pfnGetPebiCount();
// 后续 VTK 构造只读取本次局部输出,无需继续占用进程级 DLL 锁。
FreeLibrary(hGridModule);
@ -1949,7 +1933,6 @@ void nmCalculationPebiGrid::commitOutputCache(
p1 = oResult.m_oGridOutput1;
p2 = oResult.m_oGridOutput2;
m_dGridControl = oSnapshot.m_oGridInput.GridControl;
m_nPebiCount = oResult.m_nPebiCount;
m_nCachedGridInputRevision = oSnapshot.m_nGridInputRevision;
m_pDataManager = pDataManager;
}

@ -157,12 +157,10 @@ nmSubWndMain::nmSubWndMain(QWidget *parent, QString sExt) :
m_bPendingResultWidgetRefresh = false;
m_bPendingResultCompletionMessage = false;
m_bPendingResultWindowReady = false;
m_nPendingResultPebiCount = -1;
m_nPendingResultSolveTimeMs = -1;
m_bSolverResultCompletionPending = false;
m_bPendingSolverSucceeded = false;
m_bPendingSolverInputChanged = false;
m_nPendingSolverPebiCount = -1;
m_nPendingSolverTimeMs = -1;
m_bSolverStartPending = false;
m_bSolverCancelRequested = false;
@ -1881,7 +1879,6 @@ void nmSubWndMain::continueSolverInputCapture()
m_pSolverFitting = nullptr;
} else {
scheduleSolverResultCompletion(false,
-1,
-1,
bInputChanged,
sFailureReason);
@ -2089,7 +2086,6 @@ bool nmSubWndMain::mergeAnaResultToFitting()
m_pPendingResultFitting = nullptr;
m_bPendingResultCompletionMessage = false;
m_bPendingResultWindowReady = false;
m_nPendingResultPebiCount = -1;
m_nPendingResultSolveTimeMs = -1;
if(pInstance->getGridType() == NM_Grid_PEBI) {
@ -2186,14 +2182,11 @@ void nmSubWndMain::showPendingSolverResultCompletion()
}
const bool bResultWindowReady = m_bPendingResultWindowReady;
const int nPebiCount = m_nPendingResultPebiCount;
const int nSolveTimeMs = m_nPendingResultSolveTimeMs;
m_bPendingResultCompletionMessage = false;
m_bPendingResultWindowReady = false;
m_nPendingResultPebiCount = -1;
m_nPendingResultSolveTimeMs = -1;
showSolverResultCompletion(bResultWindowReady,
nPebiCount,
nSolveTimeMs);
}
@ -2427,7 +2420,6 @@ bool nmSubWndMain::on_calculationFinished(
void nmSubWndMain::scheduleSolverResultCompletion(
bool bSucceeded,
int nPebiCount,
int nSolveTimeMs,
bool bInputChanged,
const QString& sFailureReason)
@ -2437,7 +2429,6 @@ void nmSubWndMain::scheduleSolverResultCompletion(
m_bPendingSolverSucceeded = bSucceeded;
m_bPendingSolverInputChanged = bInputChanged;
m_sPendingSolverFailureReason = sFailureReason;
m_nPendingSolverPebiCount = nPebiCount;
m_nPendingSolverTimeMs = nSolveTimeMs;
// 当前完成信号栈只登记后续工作;隐藏和结果刷新各占一轮独立事件。
@ -2461,13 +2452,11 @@ void nmSubWndMain::completePendingSolverResult()
const bool bSucceeded = m_bPendingSolverSucceeded;
const bool bInputChanged = m_bPendingSolverInputChanged;
const QString sFailureReason = m_sPendingSolverFailureReason;
const int nPebiCount = m_nPendingSolverPebiCount;
const int nSolveTimeMs = m_nPendingSolverTimeMs;
m_bSolverResultCompletionPending = false;
m_bPendingSolverSucceeded = false;
m_bPendingSolverInputChanged = false;
m_sPendingSolverFailureReason.clear();
m_nPendingSolverPebiCount = -1;
m_nPendingSolverTimeMs = -1;
bool bResultWindowReady = false;
@ -2494,11 +2483,9 @@ void nmSubWndMain::completePendingSolverResult()
m_bPendingResultWidgetRefresh) {
// 首次结果页尚未填充,最终提示必须等页面真实创建结果返回后再显示。
m_bPendingResultCompletionMessage = true;
m_nPendingResultPebiCount = nPebiCount;
m_nPendingResultSolveTimeMs = nSolveTimeMs;
} else if(bSucceeded) {
showSolverResultCompletion(bResultWindowReady,
nPebiCount,
nSolveTimeMs);
}
@ -2511,14 +2498,21 @@ void nmSubWndMain::completePendingSolverResult()
void nmSubWndMain::showSolverResultCompletion(
bool bResultWindowReady,
int nPebiCount,
int nSolveTimeMs)
{
if(bResultWindowReady && nPebiCount >= 0 && nSolveTimeMs >= 0) {
QMessageBox::information(this, tr("Solver completed"),
tr("Grid count: %1\nSolve time: %2 ms")
.arg(nPebiCount)
.arg(nSolveTimeMs));
// 完成提示只显示 DLL 返回的本次求解耗时。
if(bResultWindowReady && nSolveTimeMs >= 0) {
QMessageBox oMessageBox(QMessageBox::Information, tr("Solver completed"),
tr("Solve time: %1 ms").arg(nSolveTimeMs),
QMessageBox::Ok, this);
// 单行耗时在提示区域水平、垂直居中,与左侧图标对齐。
QLabel* pMessageLabel = oMessageBox.findChild<QLabel*>("qt_msgbox_label");
if(pMessageLabel != nullptr) {
pMessageLabel->setAlignment(Qt::AlignCenter);
pMessageLabel->setMinimumHeight(
oMessageBox.iconPixmap().height());
}
oMessageBox.exec();
} else if(!bResultWindowReady) {
QMessageBox::warning(
this,
@ -2536,7 +2530,6 @@ void nmSubWndMain::on_solverTaskFinished(bool isSuccessed)
return;
}
int nPebiCount = pTask != nullptr ? pTask->getPebiCount() : -1;
int nSolveTimeMs = pTask != nullptr ? pTask->getSolveTimeMs() : -1;
const bool bCancelled = pTask->wasCancelled();
QString sFailureReason = pTask->getFailureReason();
@ -2575,7 +2568,6 @@ void nmSubWndMain::on_solverTaskFinished(bool isSuccessed)
m_bSolverCancelRequested = false;
} else {
scheduleSolverResultCompletion(isSuccessed,
nPebiCount,
nSolveTimeMs,
bInputChanged,
sFailureReason);

Loading…
Cancel
Save