You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
nmWTAI-Platform/Src/nmNum/nmCalculation/nmCalculationPebiGridTask.cpp

67 lines
2.2 KiB
C++

#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 和求解输入。
// run() 启动后不得再读取 DataManager 中的井、断层或参数对象。
m_bSnapshotValid =
nmCalculationPebiGrid::getInstance()->captureInputSnapshot(
m_pDataManager, m_oInputSnapshot);
}
}
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;
}
}