#pragma once #include #include #include #include "snake.h" #include #include #include #include struct RoutingData { snake::BoostLineString route; snake::Transects transects; std::vector transectsInfo; }; //! //! \brief The CSWorker class //! \note Don't call QThread::start, QThread::quit, etc. onyl use Worker //! members! class RoutingThread : public QThread { Q_OBJECT using Lock = std::unique_lock; public: using PtrRoutingData = QSharedPointer; using Generator = std::function; RoutingThread(QObject *parent = nullptr); ~RoutingThread() override; bool calculating(); public slots: void route(const snake::BoostPolygon &safeArea, const Generator &generator); signals: void result(PtrRoutingData pTransects); void calculatingChanged(); protected: void run() override; private: mutable std::mutex _mutex; mutable std::condition_variable _cv; // Internal data snake::BoostPolygon _safeArea; Generator _generator; // transect generator // State std::atomic_bool _calculating; std::atomic_bool _stop; std::atomic_bool _restart; };