From 87641c3bc6ffeb207a7a4f365652cc6689f5a026 Mon Sep 17 00:00:00 2001 From: lvjunjie Date: Wed, 21 Oct 2026 15:48:00 +0800 Subject: [PATCH] =?UTF-8?q?fix(nmNum):=20=E7=A7=BB=E9=99=A4=E7=BD=91?= =?UTF-8?q?=E6=A0=BC=E6=95=B0=E9=87=8F=E7=BB=9F=E8=AE=A1=E5=B9=B6=E5=B1=85?= =?UTF-8?q?=E4=B8=AD=E6=98=BE=E7=A4=BA=E6=B1=82=E8=A7=A3=E8=80=97=E6=97=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (cherry picked from commit 9ba4f2e0ccf3ce62ca5c7e43048b397f8e6d11b5) --- Bin/Config/Lang/cn/nmNum_cn.qm | Bin 154092 -> 174603 bytes Bin/Config/Lang/cn/nmNum_cn.ts | 6 ++-- .../nmCalculationDllPebiSolverTask.h | 4 --- .../nmCalculation/nmCalculationPebiGrid.h | 6 ---- Include/nmNum/nmSubWnd/nmSubWndMain.h | 4 --- .../nmCalculationDllPebiSolverTask.cpp | 14 +------- .../nmCalculation/nmCalculationPebiGrid.cpp | 21 ++--------- Src/nmNum/nmSubWnd/nmSubWndMain.cpp | 34 +++++++----------- 8 files changed, 18 insertions(+), 71 deletions(-) diff --git a/Bin/Config/Lang/cn/nmNum_cn.qm b/Bin/Config/Lang/cn/nmNum_cn.qm index ee2939dce4d2d8a0e3380101cd2b20015efdb95a..2df2b12098e5fa0ed778b26b965fdf1a196c376d 100644 GIT binary patch delta 32677 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 A9K?=XG~o>;Vf_mqE;Sl%&71J z1Yc~oKDs4LU>gx3+oNYMC_(xdmVG^JcdQdv_g^g%j@-= zAOL={(zF_&JI+2XIF)2Mvzg!AVSCMf zfVp_F*U9EQ{p55y92Ge%C%~H~alt*i`P-dx{roWx21wg4j<|erT0zGtwzMoAC*_`O zHvPY?VdC51bJm-pR%dIs2D{5kG%aU5^KYiIjoY#ePlfxZ;ju`0<}7d^WyBJ_u#15| zYb&OsE##4uv@k0W8a|Wwlr5YHu*t8FQRFv(mDXL`v_;R>Y}*#qlF!k|BSF0~RXQ7q z67BPDh*%Y_2qKs`!#V^w{jZ?lUWg}yG0 zt!4LRbyqs9E9$$nt6k`;@&HW%&guZHC%*J$k=~d0G4jnzV@3t`vx!d@NPjI+XuU=7 zl+x>Hwr@%4?XItXNlwR>xJxfQS5|@O18K)UCEfC+)#fcW$4e#{#IL9Wbrg2}UHl6W z@;V0A4)2%0Ujmy`255=@vJs12V_%tOXo({fk$3mMOvO3uNi4h5M(rdas#guFUUrt< zq%B^Hj6?g&b7D3nv)2E#BF(GC@j4DFax8w5jj_uWwg=n1DQEFUQn|2rZ13`E6egT; z3frM+xUsR!yoj?a^j%My8Df2nKWggsz|`!cmTrt%U;ZdM(MOzclVAF=+ie?L?>`y) zZWg?bf=!nw44AQak=PI%mokXnE}|Z_@PL|&hsD!E0xz^SrPY4(GqNH(=wGJdY&|M# z@2Su@q!RCQ(A5?`xV#Zb*+TP-Ld#^sK&GJue?Q`Y!@xX>wsGK>m-@M3oM^BPJbongbB_6Bb(UJgQP19dlGyyy>jsRU}w7%Y)IP{c^B{UuWIETA^r*k`x5y3Dtbv4 zZ=71vjCjMI|0?6lizsWAGrb7kw|7uIymFwXhG)}I`|DcyMnZ4ETTqEGB&K+)@dvH> zQNq^GEF^h$`-dm+rVW&>-R|suy<@#x$dxgT{;Z(bI>@f!i1s`R{rt{7Kd1OCAL|eB zzAQMl8+v+H0orzh^DMhNIP6IH1)NV5)=p^F&RQXvu{^2!FPW#Q;Zsg@Z|1H2iH#fn zHDLLBiZPo^Lq&eU+FBG^m6}K7Vi+>}B`D2{tUIH=d}^8M28YL5=C{92)_2s;NT^9oWx9 zsEjMp6bP@11hLz9IVCO=ryR9|V9d*t>dY!L!%TEuHk_2^xjj90PVwjVjAfUoiqf<$%*cz`*ArXN$>O6k+l1T&?h(T*sm%xaIMU~i=f?JPk%3C e6`CE@a`_9TA>`|;bp6adqav7Y+umOAa{51w9>0(P delta 13243 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 ip4yWQshgg%nvGnsDs7A4lwP8PP@`e`?d3v%求解已完成且结果已提交,但无法打开结果窗口。 - Grid count: %1 -Solve time: %2 ms - 网格数量:%1 -本次求解耗时:%2 ms + Solve time: %1 ms + 本次求解耗时:%1 ms diff --git a/Include/nmNum/nmCalculation/nmCalculationDllPebiSolverTask.h b/Include/nmNum/nmCalculation/nmCalculationDllPebiSolverTask.h index 7f911e13..39f6857f 100644 --- a/Include/nmNum/nmCalculation/nmCalculationDllPebiSolverTask.h +++ b/Include/nmNum/nmCalculation/nmCalculationDllPebiSolverTask.h @@ -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 > m_autoFitResultPressure; ///< 目标井原始压力结果。 diff --git a/Include/nmNum/nmCalculation/nmCalculationPebiGrid.h b/Include/nmNum/nmCalculation/nmCalculationPebiGrid.h index 35cee7e9..34dad3f4 100644 --- a/Include/nmNum/nmCalculation/nmCalculationPebiGrid.h +++ b/Include/nmNum/nmCalculation/nmCalculationPebiGrid.h @@ -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 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; diff --git a/Include/nmNum/nmSubWnd/nmSubWndMain.h b/Include/nmNum/nmSubWnd/nmSubWndMain.h index 99ecc766..14d0261f 100644 --- a/Include/nmNum/nmSubWnd/nmSubWndMain.h +++ b/Include/nmNum/nmSubWnd/nmSubWndMain.h @@ -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; ///< 已向当前任务发送停止请求,忽略后续阶段信号。 diff --git a/Src/nmNum/nmCalculation/nmCalculationDllPebiSolverTask.cpp b/Src/nmNum/nmCalculation/nmCalculationDllPebiSolverTask.cpp index 5893bbe1..0e218453 100644 --- a/Src/nmNum/nmCalculation/nmCalculationDllPebiSolverTask.cpp +++ b/Src/nmNum/nmCalculation/nmCalculationDllPebiSolverTask.cpp @@ -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") diff --git a/Src/nmNum/nmCalculation/nmCalculationPebiGrid.cpp b/Src/nmNum/nmCalculation/nmCalculationPebiGrid.cpp index bb27ec70..8eae36a1 100644 --- a/Src/nmNum/nmCalculation/nmCalculationPebiGrid.cpp +++ b/Src/nmNum/nmCalculation/nmCalculationPebiGrid.cpp @@ -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 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( GetProcAddress(hGridModule, "HX_NWTM_GRID")); - GetIntValueFunc pfnGetPebiCount = - reinterpret_cast( - 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; } diff --git a/Src/nmNum/nmSubWnd/nmSubWndMain.cpp b/Src/nmNum/nmSubWnd/nmSubWndMain.cpp index d4cbb02d..a733cc10 100644 --- a/Src/nmNum/nmSubWnd/nmSubWndMain.cpp +++ b/Src/nmNum/nmSubWnd/nmSubWndMain.cpp @@ -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("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);