#include "nmCalculationPebiGridTask.h" #include "nmCalculationPebiGrid.h" #include "nmDataAnalyzeManager.h" nmCalculationPebiGridTask::nmCalculationPebiGridTask( nmDataAnalyzeManager* pDataManager, QObject *parent) : QThread(parent), m_pDataManager(pDataManager), m_bManagerUseActive(false), m_bSnapshotValid(false) { if(m_pDataManager != nullptr) { m_pDataManager->beginBackgroundUse(); m_bManagerUseActive = true; // 第一步:构造函数运行在主线程,此处只复制建网所需的 Map 几何输入。 // 流量、PVT 等求解制度不可用时不能阻止独立建网。 // run() 启动后不得再读取 DataManager 中的井、断层或参数对象。 m_bSnapshotValid = nmCalculationPebiGrid::getInstance()->captureInputSnapshot( m_pDataManager, m_oInputSnapshot, false, false); } } nmCalculationPebiGridTask::~nmCalculationPebiGridTask() { if(isRunning()) { wait(); } releaseDataManagerUse(); } void nmCalculationPebiGridTask::run() { // 第二步:后台只消费不可变快照,所有 DLL 输出和 VTK 数据先保存在任务内部。 const bool success = m_bSnapshotValid && nmCalculationPebiGrid::getInstance()->calculateSnapshot( m_oInputSnapshot, m_oResult); // 完成通知可能引起成果窗口销毁,发信号前先解除 DataManager 使用权。 releaseDataManagerUse(); // 无论成功或失败都通知窗口,使其可以结束本轮任务状态并处理后续待刷新请求。 emit pebiGridGenerated(success); } bool nmCalculationPebiGridTask::commitResult( nmDataAnalyzeManager* pDataManager) { // 第三步:该方法由网格窗口的主线程槽调用。版本不一致时只丢弃局部结果, // 绝不覆盖用户编辑后已经失效或重新生成的网格。 if(!m_bSnapshotValid || !m_oResult.m_bSucceeded || pDataManager == nullptr) { return false; } return nmCalculationPebiGrid::getInstance()->commitSnapshotResult( pDataManager, m_oInputSnapshot, m_oResult); } void nmCalculationPebiGridTask::releaseDataManagerUse() { if(m_bManagerUseActive && m_pDataManager != nullptr) { m_pDataManager->endBackgroundUse(); m_bManagerUseActive = false; } }