#pragma once #include #include #include #include #include "snake.h" #include #include #include //! //! \brief The CSWorker class //! \note Don't call QThread::start, QThread::quit, etc. onyl use Worker //! members! class CSWorker : public QThread { Q_OBJECT using Lock = std::unique_lock; public: using Route = QList; using PtrRoute = QSharedPointer; CSWorker(QObject *parent = nullptr); ~CSWorker() override; bool calculating(); public slots: void update(const QList &polygon, const QGeoCoordinate &origin, snake::Length deltaR, snake::Length minLength, snake::Angle deltaAlpha); signals: void ready(PtrRoute pTransects); void calculatingChanged(); protected: void run() override; private: mutable std::mutex _mutex; mutable std::condition_variable _cv; // Internal data QList _polygon; QGeoCoordinate _origin; snake::Length _deltaR; snake::Angle _deltaAlpha; snake::Length _minLength; std::size_t _maxWaypoints; // State std::atomic_bool _calculating; std::atomic_bool _stop; std::atomic_bool _restart; };