Background worker.

This commit is contained in:
Krad
2022-08-01 09:16:26 +08:00
parent 9e405b9b78
commit a5a117cbe1
7 changed files with 155 additions and 19 deletions

View 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();
}
}

View 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

View File

@@ -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;
}

View File

@@ -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:

View 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);
}

View 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

View File

@@ -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();
}