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/nmSubWxs/nmVolumeImportTask.cpp

40 lines
1.5 KiB
C++

#include "nmVolumeImportTask.h"
#include "nmVolumeDataImporter.h"
nmVolumeImportTask::nmVolumeImportTask(const QString& sFilePath, QObject* pParent)
: QThread(pParent), m_sFilePath(sFilePath), m_nCancelRequested(0), m_nLastProgress(-1)
{
}
nmVolumeImportTask::~nmVolumeImportTask()
{
// 析构是最后一道生命周期保护,不允许销毁仍在执行 VTK 代码的线程。
requestCancel();
wait();
}
void nmVolumeImportTask::requestCancel() { m_nCancelRequested.fetchAndStoreRelease(1); }
bool nmVolumeImportTask::isCanceled() const { return m_nCancelRequested.fetchAndAddAcquire(0) != 0; }
void nmVolumeImportTask::reportProgress(int nPercent)
{
nPercent = qBound(0, nPercent, 100);
if(nPercent > m_nLastProgress) {
m_nLastProgress = nPercent;
emit progressChanged(nPercent);
}
}
void nmVolumeImportTask::run()
{
try {
m_pResult = nmVolumeDataImporter::loadFile(m_sFilePath, &m_sError, this);
} catch(...) {
// C++ 异常不得越过 QThread::run 边界,否则一次导入可能终止整个进程。
m_pResult.clear();
m_sError = tr("An unexpected error occurred while importing the volume mesh.");
}
if(isCanceled()) m_pResult.clear();
}
QSharedPointer<const nmVolumeData> nmVolumeImportTask::getResult() const
{
return isFinished() && !isCanceled() ? m_pResult : QSharedPointer<const nmVolumeData>();
}
QString nmVolumeImportTask::getError() const { return isFinished() ? m_sError : QString(); }