/* * Copyright (C) 2015 by Multi-Tech Systems * * This file is part of libmts. * * libmts is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * libmts is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with libmts. If not, see . * */ /*! \file MTS_Thread.h \brief A thread \date 15JUN11 \author Sean Godinez A platform independent thread. */ #ifndef _MTS_THREAD_H_ #define _MTS_THREAD_H_ #include #include #include #include #include #include #ifdef WIN32 #include #else #include #endif namespace MTS { //! An abstract thread /*! A platform independent abstract thread class \sa Condition, Lock */ class Thread: private NonCopyable { public: virtual ~Thread(); //!< Destructs thread static void sleep(uint32_t iMillis); //!< Pauses calling thread for the given amount of milliseconds const std::string& getName() const; //!< Returns the name of thread virtual void start(); //!< Starts thread virtual void stop(); //!< Ends thread void wait(); //!< Block until *this thread has finished executing void wait(uint32_t millis); //!< Waits on signal for *this thread to finish executing or time is up bool isAlive() const; //!< Returns true if it is still running bool isCanceled() const; //!< Returns true if it has been told to shutdown bool isDone() const; //!< Returns true if it finished running bool isManaged() const; //!< Returns true if it should not Destruct itself when done running protected: explicit Thread(const std::string& name, bool managed = true); //!< Explicit Constructor private: #ifdef WIN32 static DWORD WINAPI doInBackground(__in LPVOID lpParameter); //!< WIN32 function callback HANDLE m_pThread;//!< WIN32 Thread Handle #else static void* doInBackground(void* parameters); //!< PTHREAD function callback pthread_t* m_pThread; //!< PTHREAD Thread Handle #endif const std::string m_sName; //!< Thread's name const bool m_bManaged; //!< Self-cleanup flag bool m_bComplete; //!< Completed flag bool m_bCanceled; //!< Canceled/Shutdown flag AutoPtr m_apThreadLock; //!< Thread Lock AutoPtr m_apStateLock; //!< State Lock AutoPtr m_apCompleteCondition; //!< Thread Completed Condition/Signal void cancel(); //!< Cancels thread by setting Canceled/Shutdown flag void done(); //!< Triggers Thread Completed Condition/Signal void reset(); //!< Resets Canceled and Completed flags virtual void run() = 0; //!< main() of *this Thread }; } #endif