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) {
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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:
|
||||
|
||||
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();
|
||||
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();
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user