#pragma once #include #include #include #include "geometry/snake.h" #include #include #include #include struct RoutingData { snake::Transects transects; std::vector solutionVector; std::string errorString; }; struct RoutingParameter { RoutingParameter() : numSolutions(1), numRuns(1) {} snake::FPolygon safeArea; std::size_t numSolutions; std::size_t numRuns; }; //! //! \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 = shared_ptr; using Generator = std::function; using Consumer = std::function; RoutingThread(QObject *parent = nullptr); ~RoutingThread() override; bool calculating() const; public slots: void route(const RoutingParameter &par, 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 RoutingParameter _par; Generator _generator; // transect generator // State std::atomic_bool _calculating; std::atomic_bool _stop; std::atomic_bool _restart; };