Background worker.
This commit is contained in:
24
src/src/Common/Worker/WorkerManager.cpp
Normal file
24
src/src/Common/Worker/WorkerManager.cpp
Normal file
@@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
25
src/src/Common/Worker/WorkerManager.h
Normal file
25
src/src/Common/Worker/WorkerManager.h
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
//
|
||||||
|
// Created by Krad on 2022/7/28.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef OMEGAV_WORKERMANAGER_H
|
||||||
|
#define OMEGAV_WORKERMANAGER_H
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
#include <QThread>
|
||||||
|
|
||||||
|
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
|
||||||
@@ -87,14 +87,13 @@ void ImageViewManager::clear(){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void ImageViewManager::setCurrentView(DicomImageView *view) {
|
void ImageViewManager::setCurrentView(DicomImageView *view) {
|
||||||
if (currentView != view) {
|
if (currentView != view) {
|
||||||
if (currentView) currentView->setHighlight(false);
|
if (currentView) currentView->setHighlight(false);
|
||||||
currentView = view;
|
currentView = view;
|
||||||
currentView->setHighlight(true);
|
currentView->setHighlight(true);
|
||||||
emit currentViewChanged(currentView->getSeriesInstance()->getUniqueID());
|
emit currentViewReload(view);
|
||||||
checkCurrentViewFusion();
|
// emit currentViewChanged(currentView->getSeriesInstance()->getUniqueID());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -265,11 +264,11 @@ void ImageViewManager::viewReload(const std::string &unique_info) {
|
|||||||
DicomLoader *helper = DicomLoader::GetInstance();
|
DicomLoader *helper = DicomLoader::GetInstance();
|
||||||
currentView->loadSeries(helper->getSeriesImageSet(unique_info));
|
currentView->loadSeries(helper->getSeriesImageSet(unique_info));
|
||||||
currentView->render();
|
currentView->render();
|
||||||
checkCurrentViewFusion();
|
emit currentViewReload(currentView);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ImageViewManager::viewCleared() {
|
void ImageViewManager::viewCleared(DicomImageView* view) {
|
||||||
emit fusionCheckStateChanged(false);
|
emit currentViewReload(view);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ImageViewManager::setInteractionMode(int InteractionMode) {
|
void ImageViewManager::setInteractionMode(int InteractionMode) {
|
||||||
@@ -302,6 +301,7 @@ void ImageViewManager::activeMeasure() {
|
|||||||
|
|
||||||
void ImageViewManager::switchSliceOrientation() {
|
void ImageViewManager::switchSliceOrientation() {
|
||||||
currentView->setSliceOrientation((currentView->getSliceOrientation() + 1) % 3);
|
currentView->setSliceOrientation((currentView->getSliceOrientation() + 1) % 3);
|
||||||
|
emit currentViewReload(currentView);
|
||||||
}
|
}
|
||||||
|
|
||||||
//Corner about-----------------------------------------------------------------
|
//Corner about-----------------------------------------------------------------
|
||||||
@@ -344,17 +344,16 @@ void ImageViewManager::switchFusion() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ImageViewManager::checkCurrentViewFusion() {
|
bool ImageViewManager::checkViewFusion(DicomImageView *view) {
|
||||||
for (int i = 0; i < getViewCount(); ++i) {
|
for (int i = 0; i < getViewCount(); ++i) {
|
||||||
if (getView(i) == getCurrentView()) continue;
|
if (getView(i) == view) continue;
|
||||||
DicomImageView *overlap_view = getView(i);
|
DicomImageView *overlap_view = getView(i);
|
||||||
if (currentView->checkFusion(overlap_view)) {
|
if (view->checkFusion(overlap_view)) {
|
||||||
currentFusionView = overlap_view;
|
currentFusionView = overlap_view;
|
||||||
emit fusionCheckStateChanged(true);
|
return true;
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
currentFusionView = nullptr;
|
currentFusionView = nullptr;
|
||||||
emit fusionCheckStateChanged(false);
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ public:
|
|||||||
return currentView;
|
return currentView;
|
||||||
}
|
}
|
||||||
|
|
||||||
void checkCurrentViewFusion();
|
bool checkViewFusion(DicomImageView *view);
|
||||||
|
|
||||||
int getViewCount() {
|
int getViewCount() {
|
||||||
return vList.size();
|
return vList.size();
|
||||||
@@ -74,7 +74,7 @@ public:
|
|||||||
|
|
||||||
void viewReload(const std::string &unique_info);
|
void viewReload(const std::string &unique_info);
|
||||||
|
|
||||||
void viewCleared();
|
void viewCleared(DicomImageView* view);
|
||||||
|
|
||||||
void setInteractionMode(int InteractionMode);
|
void setInteractionMode(int InteractionMode);
|
||||||
|
|
||||||
@@ -110,7 +110,8 @@ public:
|
|||||||
DoScope scope = Current);
|
DoScope scope = Current);
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void currentViewChanged(const std::string& seriesID);
|
// void currentViewChanged(const std::string& seriesID);
|
||||||
|
void currentViewReload( DicomImageView * view);
|
||||||
void fusionCheckStateChanged(bool able);
|
void fusionCheckStateChanged(bool able);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|||||||
26
src/src/UI/Manager/ImageViewStateCheckWorker.cpp
Normal file
26
src/src/UI/Manager/ImageViewStateCheckWorker.cpp
Normal file
@@ -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>("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);
|
||||||
|
}
|
||||||
39
src/src/UI/Manager/ImageViewStateCheckWorker.h
Normal file
39
src/src/UI/Manager/ImageViewStateCheckWorker.h
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
//
|
||||||
|
// Created by Krad on 2022/7/28.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef OMEGAV_IMAGEVIEWSTATECHECKWORKER_H
|
||||||
|
#define OMEGAV_IMAGEVIEWSTATECHECKWORKER_H
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
|
||||||
|
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
|
||||||
@@ -177,6 +177,24 @@ void QDicomViewer::createToolButton() {
|
|||||||
syncStateChanged();
|
syncStateChanged();
|
||||||
ui->viewContainer->getViewManager()->switchSliceOrientation();
|
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) {
|
void QDicomViewer::SetupFullScreenTool(QToolButton *btnfullscreen) {
|
||||||
@@ -385,10 +403,6 @@ void QDicomViewer::SetupFusionTool(QToolButton *fusionBtn) {
|
|||||||
fusionBtn->setPopupMode(QToolButton::MenuButtonPopup);
|
fusionBtn->setPopupMode(QToolButton::MenuButtonPopup);
|
||||||
fusionBtn->setMenu(m);
|
fusionBtn->setMenu(m);
|
||||||
fusionBtn->setEnabled(false);
|
fusionBtn->setEnabled(false);
|
||||||
connect(ui->viewContainer->getViewManager(),
|
|
||||||
&ImageViewManager::fusionCheckStateChanged,[=](bool v){
|
|
||||||
fusionBtn->setEnabled(v);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//视窗操作,slice
|
//视窗操作,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();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user