From a5a117cbe1c8e4c529b64a19b37ba9284277d98a Mon Sep 17 00:00:00 2001 From: Krad Date: Mon, 1 Aug 2022 09:16:26 +0800 Subject: [PATCH] Background worker. --- src/src/Common/Worker/WorkerManager.cpp | 24 ++++++++++++ src/src/Common/Worker/WorkerManager.h | 25 ++++++++++++ src/src/UI/Manager/ImageViewManager.cpp | 23 ++++++----- src/src/UI/Manager/ImageViewManager.h | 7 ++-- .../UI/Manager/ImageViewStateCheckWorker.cpp | 26 +++++++++++++ .../UI/Manager/ImageViewStateCheckWorker.h | 39 +++++++++++++++++++ src/src/UI/Window/QDicomViewer.cpp | 30 ++++++++++++-- 7 files changed, 155 insertions(+), 19 deletions(-) create mode 100644 src/src/Common/Worker/WorkerManager.cpp create mode 100644 src/src/Common/Worker/WorkerManager.h create mode 100644 src/src/UI/Manager/ImageViewStateCheckWorker.cpp create mode 100644 src/src/UI/Manager/ImageViewStateCheckWorker.h diff --git a/src/src/Common/Worker/WorkerManager.cpp b/src/src/Common/Worker/WorkerManager.cpp new file mode 100644 index 0000000..419e3cd --- /dev/null +++ b/src/src/Common/Worker/WorkerManager.cpp @@ -0,0 +1,24 @@ +// +// Created by Krad on 2022/7/28. +// + +#include "WorkerManager.h" + +WorkerManager::WorkerManager(QObject *parent) : QObject(parent) { + +} + +WorkerManager::~WorkerManager() { + mWorkThread.quit(); + mWorkThread.wait(); +} + +void WorkerManager::registerWorker(QObject *worker) { + worker->moveToThread(&mWorkThread); + // 该线程结束时销毁 + connect(&mWorkThread, &QThread::finished, worker, &QObject::deleteLater); + + if(!mWorkThread.isRunning()){ + mWorkThread.start(); + } +} diff --git a/src/src/Common/Worker/WorkerManager.h b/src/src/Common/Worker/WorkerManager.h new file mode 100644 index 0000000..cd70a58 --- /dev/null +++ b/src/src/Common/Worker/WorkerManager.h @@ -0,0 +1,25 @@ +// +// Created by Krad on 2022/7/28. +// + +#ifndef OMEGAV_WORKERMANAGER_H +#define OMEGAV_WORKERMANAGER_H + +#include +#include + +class WorkerManager:public QObject { + Q_OBJECT +public: + explicit WorkerManager(QObject *parent = nullptr); + + ~WorkerManager() override ; + + void registerWorker(QObject* worker); + +private: + QThread mWorkThread; +}; + + +#endif //OMEGAV_WORKERMANAGER_H diff --git a/src/src/UI/Manager/ImageViewManager.cpp b/src/src/UI/Manager/ImageViewManager.cpp index 09d377b..8fdbf10 100644 --- a/src/src/UI/Manager/ImageViewManager.cpp +++ b/src/src/UI/Manager/ImageViewManager.cpp @@ -87,14 +87,13 @@ void ImageViewManager::clear(){ } } - void ImageViewManager::setCurrentView(DicomImageView *view) { if (currentView != view) { if (currentView) currentView->setHighlight(false); currentView = view; currentView->setHighlight(true); - emit currentViewChanged(currentView->getSeriesInstance()->getUniqueID()); - checkCurrentViewFusion(); + emit currentViewReload(view); +// emit currentViewChanged(currentView->getSeriesInstance()->getUniqueID()); } } @@ -265,11 +264,11 @@ void ImageViewManager::viewReload(const std::string &unique_info) { DicomLoader *helper = DicomLoader::GetInstance(); currentView->loadSeries(helper->getSeriesImageSet(unique_info)); currentView->render(); - checkCurrentViewFusion(); + emit currentViewReload(currentView); } -void ImageViewManager::viewCleared() { - emit fusionCheckStateChanged(false); +void ImageViewManager::viewCleared(DicomImageView* view) { + emit currentViewReload(view); } void ImageViewManager::setInteractionMode(int InteractionMode) { @@ -302,6 +301,7 @@ void ImageViewManager::activeMeasure() { void ImageViewManager::switchSliceOrientation() { currentView->setSliceOrientation((currentView->getSliceOrientation() + 1) % 3); + emit currentViewReload(currentView); } //Corner about----------------------------------------------------------------- @@ -344,17 +344,16 @@ void ImageViewManager::switchFusion() { } } -void ImageViewManager::checkCurrentViewFusion() { +bool ImageViewManager::checkViewFusion(DicomImageView *view) { for (int i = 0; i < getViewCount(); ++i) { - if (getView(i) == getCurrentView()) continue; + if (getView(i) == view) continue; DicomImageView *overlap_view = getView(i); - if (currentView->checkFusion(overlap_view)) { + if (view->checkFusion(overlap_view)) { currentFusionView = overlap_view; - emit fusionCheckStateChanged(true); - return; + return true; } } currentFusionView = nullptr; - emit fusionCheckStateChanged(false); + return false; } diff --git a/src/src/UI/Manager/ImageViewManager.h b/src/src/UI/Manager/ImageViewManager.h index c5ce3f2..cb6ff67 100644 --- a/src/src/UI/Manager/ImageViewManager.h +++ b/src/src/UI/Manager/ImageViewManager.h @@ -40,7 +40,7 @@ public: return currentView; } - void checkCurrentViewFusion(); + bool checkViewFusion(DicomImageView *view); int getViewCount() { return vList.size(); @@ -74,7 +74,7 @@ public: void viewReload(const std::string &unique_info); - void viewCleared(); + void viewCleared(DicomImageView* view); void setInteractionMode(int InteractionMode); @@ -110,7 +110,8 @@ public: DoScope scope = Current); signals: - void currentViewChanged(const std::string& seriesID); +// void currentViewChanged(const std::string& seriesID); + void currentViewReload( DicomImageView * view); void fusionCheckStateChanged(bool able); private: diff --git a/src/src/UI/Manager/ImageViewStateCheckWorker.cpp b/src/src/UI/Manager/ImageViewStateCheckWorker.cpp new file mode 100644 index 0000000..96db835 --- /dev/null +++ b/src/src/UI/Manager/ImageViewStateCheckWorker.cpp @@ -0,0 +1,26 @@ +// +// Created by Krad on 2022/7/28. +// + +#include "ImageViewStateCheckWorker.h" + +#include "ImageViewManager.h" + + +ImageViewStateCheckWorker::ImageViewStateCheckWorker(QObject *parent) : QObject(parent) { + qRegisterMetaType("ViewFunctionState"); +} + +ImageViewStateCheckWorker::~ImageViewStateCheckWorker() { + +} + +void ImageViewStateCheckWorker::checkImageViewState(DicomImageView *view) { + if (!mManager || !view) return; + QThread::sleep(2); + ViewFunctionState state; + state.canSync=false; + state.canMPR=true; + state.canFusion=true; + emit imageViewStateChanged(state); +} diff --git a/src/src/UI/Manager/ImageViewStateCheckWorker.h b/src/src/UI/Manager/ImageViewStateCheckWorker.h new file mode 100644 index 0000000..3ba7009 --- /dev/null +++ b/src/src/UI/Manager/ImageViewStateCheckWorker.h @@ -0,0 +1,39 @@ +// +// Created by Krad on 2022/7/28. +// + +#ifndef OMEGAV_IMAGEVIEWSTATECHECKWORKER_H +#define OMEGAV_IMAGEVIEWSTATECHECKWORKER_H + +#include + +class DicomImageView; +class ImageViewManager; + +struct ViewFunctionState{ + bool canSync; + bool canMPR; + bool canFusion; +}; + +class ImageViewStateCheckWorker: public QObject { + Q_OBJECT +public: + explicit ImageViewStateCheckWorker(QObject *parent = nullptr); + + ~ImageViewStateCheckWorker() override; + + void checkImageViewState(DicomImageView* view); + + void setManager(ImageViewManager* manager){ + mManager = manager; + } +signals: + void imageViewStateChanged(ViewFunctionState state); + +private: + ImageViewManager* mManager; +}; + + +#endif //OMEGAV_IMAGEVIEWSTATECHECKWORKER_H diff --git a/src/src/UI/Window/QDicomViewer.cpp b/src/src/UI/Window/QDicomViewer.cpp index db096dd..c63545d 100644 --- a/src/src/UI/Window/QDicomViewer.cpp +++ b/src/src/UI/Window/QDicomViewer.cpp @@ -177,6 +177,24 @@ void QDicomViewer::createToolButton() { syncStateChanged(); ui->viewContainer->getViewManager()->switchSliceOrientation(); }); + btnMPR->setEnabled(false); + mprBtn = btnMPR; + fusionBtn = btnfusion; + connect(ui->viewContainer->getViewManager(), + &ImageViewManager::currentViewReload,[=](){ + btnfusion->setEnabled(false); + btnMPR->setEnabled(false); + SyncHelper::setSyncState(DIS_SYNC); + syncStateChanged(); + }); + + worker.setManager(ui->viewContainer->getViewManager()); + connect(ui->viewContainer->getViewManager(), + &ImageViewManager::currentViewReload, + &worker,&ImageViewStateCheckWorker::checkImageViewState, Qt::QueuedConnection); + connect(&worker,&ImageViewStateCheckWorker::imageViewStateChanged, + this,&QDicomViewer::resetToolBarButtons, Qt::QueuedConnection); + workerManager.registerWorker(&worker); } void QDicomViewer::SetupFullScreenTool(QToolButton *btnfullscreen) { @@ -385,10 +403,6 @@ void QDicomViewer::SetupFusionTool(QToolButton *fusionBtn) { fusionBtn->setPopupMode(QToolButton::MenuButtonPopup); fusionBtn->setMenu(m); fusionBtn->setEnabled(false); - connect(ui->viewContainer->getViewManager(), - &ImageViewManager::fusionCheckStateChanged,[=](bool v){ - fusionBtn->setEnabled(v); - }); } //视窗操作,slice @@ -705,3 +719,11 @@ void QDicomViewer::openDICOM(const std::string &dicomName, SeriesOpenMode openMo } +void QDicomViewer::resetToolBarButtons(ViewFunctionState state) { + fusionBtn->setEnabled(state.canFusion); + mprBtn->setEnabled(state.canMPR); + SyncHelper::setSyncState(state.canSync?AUTO_SYNC:DIS_SYNC); + syncStateChanged(); +} + +