#ifndef NMVOLUMEIMPORTTASK_H #define NMVOLUMEIMPORTTASK_H #include "nmSubWxs_global.h" #include "nmVolumeData.h" #include #include /** * @brief 每个结果窗口独占的导入任务。 * 工作线程只操作局部 Reader 和数据候选,不访问 QWidget、Renderer 或 Manager。 * 结果只允许在 finished 后读取;取消标志是唯一由两个线程同时访问的成员。 */ class NM_SUB_WXS_EXPORT nmVolumeImportTask : public QThread, public nmVolumeImportFeedback { Q_OBJECT public: /** @brief 保存输入路径,线程由调用方显式 start;父对象通常为结果窗口。 */ explicit nmVolumeImportTask(const QString& sFilePath, QObject* pParent = nullptr); /** @brief 请求取消并等待安全退出,禁止释放仍运行的 VTK 代码资源。 */ virtual ~nmVolumeImportTask(); /** @brief 原子请求取消,可由 GUI 线程调用,不阻塞等待 Reader。 */ void requestCancel(); /** @brief 线程安全查询取消标记,供导入器的处理循环调用。 */ virtual bool isCanceled() const; /** @brief 工作线程发出单调去重的进度信号,GUI 使用队列连接接收。 */ virtual void reportProgress(int nPercent); /** @brief 仅在线程结束且未取消时返回结果,否则返回空指针。 */ QSharedPointer getResult() const; /** @brief 在线程结束后返回错误文本;运行期间不读取跨线程字符串。 */ QString getError() const; signals: /** @brief 已完成的加载百分比,不包含 GUI 场景提交耗时。 */ void progressChanged(int nPercent); protected: /** @brief 工作线程入口,构建局部候选;取消后丢弃候选而不发布。 */ virtual void run(); private: Q_DISABLE_COPY(nmVolumeImportTask) QString m_sFilePath; ///< 创建时固定的输入路径,运行期间不再改写。 mutable QAtomicInt m_nCancelRequested; ///< GUI 写入、工作线程读取的原子取消标志。 QSharedPointer m_pResult; ///< 工作线程写入,finished 后 GUI 才读取。 QString m_sError; ///< 工作线程写入的失败原因,finished 后读取。 int m_nLastProgress; ///< 仅工作线程写入,减少重复的队列事件。 }; #endif // NMVOLUMEIMPORTTASK_H