#ifndef THREAD_H_
#define THREAD_H_
 
#include <thread>
#include <iostream>
#include <utility>
#include <system_error>
 
class CThread
{
public:
	CThread() : _bRun(false){}
	CThread(CThread& src): _bRun(src._bRun), _thread(move(src._thread)){src._bRun = false;}
 
	virtual ~CThread()
	{
		if(_thread.joinable())
			_thread.detach();
	}
 
	template <typename F, typename... Args>
	bool Start(F&& f, Args&&... args)
	{
		if(_bRun) return false;
		try
		{
			_bRun = true;
			_thread = std::thread(std::forward<F>(f), std::forward<Args>(args)...);
		}
		catch(std::system_error& ex)
		{
			std::cout << "start thread fails:" << ex.what() << std::endl;
		}
		catch(...)
		{
			std::cout << "start thread fails" << std::endl;
		}
		return _bRun;
	}
 
	bool IsRun() const {return _bRun;}
	void Join()
	{
		bool bRun = _bRun;
		_bRun = false;
		if(bRun)
			_thread.join();
	}
 
private:
	bool 		_bRun;
	std::thread	_thread;
};
 
#endif /* THREAD_H_ */