diff --git a/src/libs/vlayout/vlayoutgenerator.cpp b/src/libs/vlayout/vlayoutgenerator.cpp index 4935b764a..755e5e508 100644 --- a/src/libs/vlayout/vlayoutgenerator.cpp +++ b/src/libs/vlayout/vlayoutgenerator.cpp @@ -39,10 +39,24 @@ //--------------------------------------------------------------------------------------------------------------------- VLayoutGenerator::VLayoutGenerator(QObject *parent) - :QObject(parent), papers(QVector()), bank(new VBank()), paperHeight(0), paperWidth(0), margins(), - usePrinterFields(true),stopGeneration(false), state(LayoutErrors::NoError), shift(0), rotate(true), - rotationIncrease(180), autoCrop(false), saveLength(false), unitePages(false), stripOptimizationEnabled(false), - multiplier(1), stripOptimization(false) + : QObject(parent), + papers(), + bank(new VBank()), + paperHeight(0), + paperWidth(0), + margins(), + usePrinterFields(true), + stopGeneration(false), + state(LayoutErrors::NoError), + shift(0), + rotate(true), + rotationIncrease(180), + autoCrop(false), + saveLength(false), + unitePages(false), + stripOptimizationEnabled(false), + multiplier(1), + stripOptimization(false) {} //--------------------------------------------------------------------------------------------------------------------- @@ -79,7 +93,7 @@ int VLayoutGenerator::DetailsCount() //--------------------------------------------------------------------------------------------------------------------- void VLayoutGenerator::Generate() { - stopGeneration = false; + stopGeneration.store(false); papers.clear(); state = LayoutErrors::NoError; @@ -110,7 +124,7 @@ void VLayoutGenerator::Generate() while (bank->AllDetailsCount() > 0) { - if (stopGeneration) + if (stopGeneration.load()) { break; } @@ -135,13 +149,13 @@ void VLayoutGenerator::Generate() bank->NotArranged(index); } - if (stopGeneration) + if (stopGeneration.load()) { break; } } while(bank->LeftArrange() > 0); - if (stopGeneration) + if (stopGeneration.load()) { break; } @@ -209,7 +223,7 @@ QList > VLayoutGenerator::GetAllDetails() const //--------------------------------------------------------------------------------------------------------------------- void VLayoutGenerator::Abort() { - stopGeneration = true; + stopGeneration.store(true); state = LayoutErrors::ProcessStoped; #if QT_VERSION >= QT_VERSION_CHECK(5, 2, 0) QThreadPool::globalInstance()->clear(); diff --git a/src/libs/vlayout/vlayoutgenerator.h b/src/libs/vlayout/vlayoutgenerator.h index 6395fb427..a953daf48 100644 --- a/src/libs/vlayout/vlayoutgenerator.h +++ b/src/libs/vlayout/vlayoutgenerator.h @@ -37,6 +37,7 @@ #include #include #include +#include #include "vbank.h" #include "vlayoutdef.h" @@ -122,7 +123,7 @@ private: qreal paperWidth; QMarginsF margins; bool usePrinterFields; - volatile bool stopGeneration; + std::atomic_bool stopGeneration; LayoutErrors state; quint32 shift; bool rotate; diff --git a/src/libs/vlayout/vlayoutpaper.cpp b/src/libs/vlayout/vlayoutpaper.cpp index 2e73be36a..82379571d 100644 --- a/src/libs/vlayout/vlayoutpaper.cpp +++ b/src/libs/vlayout/vlayoutpaper.cpp @@ -183,7 +183,7 @@ void VLayoutPaper::SetPaperIndex(quint32 index) } //--------------------------------------------------------------------------------------------------------------------- -bool VLayoutPaper::ArrangeDetail(const VLayoutPiece &detail, volatile bool &stop) +bool VLayoutPaper::ArrangeDetail(const VLayoutPiece &detail, std::atomic_bool &stop) { // First need set size of paper if (d->globalContour.GetHeight() <= 0 || d->globalContour.GetWidth() <= 0) @@ -219,7 +219,7 @@ int VLayoutPaper::Count() const } //--------------------------------------------------------------------------------------------------------------------- -bool VLayoutPaper::AddToSheet(const VLayoutPiece &detail, volatile bool &stop) +bool VLayoutPaper::AddToSheet(const VLayoutPiece &detail, std::atomic_bool &stop) { VBestSquare bestResult(d->globalContour.GetSize(), d->saveLength); QThreadPool *thread_pool = QThreadPool::globalInstance(); @@ -266,9 +266,9 @@ bool VLayoutPaper::AddToSheet(const VLayoutPiece &detail, volatile bool &stop) QCoreApplication::processEvents(); QThread::msleep(250); } - while(thread_pool->activeThreadCount() > 0 && not stop); + while(thread_pool->activeThreadCount() > 0 && not stop.load()); - if (stop) + if (stop.load()) { qDeleteAll(threads.begin(), threads.end()); threads.clear(); diff --git a/src/libs/vlayout/vlayoutpaper.h b/src/libs/vlayout/vlayoutpaper.h index 426466341..76b0ce404 100644 --- a/src/libs/vlayout/vlayoutpaper.h +++ b/src/libs/vlayout/vlayoutpaper.h @@ -33,6 +33,7 @@ #include #include #include +#include #include "vlayoutdef.h" @@ -77,7 +78,7 @@ public: void SetPaperIndex(quint32 index); - bool ArrangeDetail(const VLayoutPiece &detail, volatile bool &stop); + bool ArrangeDetail(const VLayoutPiece &detail, std::atomic_bool &stop); int Count() const; QGraphicsRectItem *GetPaperItem(bool autoCrop) const Q_REQUIRED_RESULT; QList GetItemDetails() const Q_REQUIRED_RESULT; @@ -90,7 +91,7 @@ public: private: QSharedDataPointer d; - bool AddToSheet(const VLayoutPiece &detail, volatile bool &stop); + bool AddToSheet(const VLayoutPiece &detail, std::atomic_bool &stop); bool SaveResult(const VBestSquare &bestResult, const VLayoutPiece &detail); diff --git a/src/libs/vlayout/vposition.cpp b/src/libs/vlayout/vposition.cpp index 6c7345a67..354f8c04c 100644 --- a/src/libs/vlayout/vposition.cpp +++ b/src/libs/vlayout/vposition.cpp @@ -50,11 +50,22 @@ #include "../vmisc/vmath.h" //--------------------------------------------------------------------------------------------------------------------- -VPosition::VPosition(const VContour &gContour, int j, const VLayoutPiece &detail, int i, volatile bool *stop, +VPosition::VPosition(const VContour &gContour, int j, const VLayoutPiece &detail, int i, std::atomic_bool *stop, bool rotate, int rotationIncrease, bool saveLength) - :QRunnable(), bestResult(VBestSquare(gContour.GetSize(), saveLength)), gContour(gContour), detail(detail), i(i), - j(j), paperIndex(0), frame(0), detailsCount(0), details(QVector()), stop(stop), rotate(rotate), - rotationIncrease(rotationIncrease), angle_between(0) + : QRunnable(), + bestResult(VBestSquare(gContour.GetSize(), saveLength)), + gContour(gContour), + detail(detail), + i(i), + j(j), + paperIndex(0), + frame(0), + detailsCount(0), + details(), + stop(stop), + rotate(rotate), + rotationIncrease(rotationIncrease), + angle_between(0) { if ((rotationIncrease >= 1 && rotationIncrease <= 180 && 360 % rotationIncrease == 0) == false) { @@ -65,7 +76,7 @@ VPosition::VPosition(const VContour &gContour, int j, const VLayoutPiece &detail //--------------------------------------------------------------------------------------------------------------------- void VPosition::run() { - if (*stop) + if (stop->load()) { return; } @@ -466,7 +477,7 @@ void VPosition::Rotate(int increase) } for (int angle = startAngle; angle < 360; angle = angle+increase) { - if (*stop) + if (stop->load()) { return; } diff --git a/src/libs/vlayout/vposition.h b/src/libs/vlayout/vposition.h index 2dd5c3437..7960d6a4d 100644 --- a/src/libs/vlayout/vposition.h +++ b/src/libs/vlayout/vposition.h @@ -33,6 +33,7 @@ #include #include #include +#include #include "vbestsquare.h" #include "vcontour.h" @@ -42,7 +43,7 @@ class VPosition : public QRunnable { public: - VPosition(const VContour &gContour, int j, const VLayoutPiece &detail, int i, volatile bool *stop, bool rotate, + VPosition(const VContour &gContour, int j, const VLayoutPiece &detail, int i, std::atomic_bool *stop, bool rotate, int rotationIncrease, bool saveLength); virtual ~VPosition() Q_DECL_OVERRIDE{} @@ -75,7 +76,7 @@ private: quint32 frame; quint32 detailsCount; QVector details; - volatile bool *stop; + std::atomic_bool *stop; bool rotate; int rotationIncrease; /**