怎么建立自己网站视频,网页制作工具按其制作方式分 可以分为,网站上内容列表怎么做,公司找人做网站一、需求 
在做播放器的时候#xff0c;很多的模块会创建一个线程#xff0c;然后在这个线程上跑单独的功能#xff0c;同时#xff0c;需要对这个线程进行控制#xff0c;比如暂停#xff0c;继续等#xff0c;如播放器的解码#xff0c;解封装等#xff0c;都需要对…一、需求 
在做播放器的时候很多的模块会创建一个线程然后在这个线程上跑单独的功能同时需要对这个线程进行控制比如暂停继续等如播放器的解码解封装等都需要对对应的线程进行控制那么为了方便的进行控制所以引入单独的thread封装并且导出对应的回调接口。 
二、实现 
1. com_thread.h 
#pragma once#include thread
#include atomicclass IThreadSink
{
public:virtual ~IThreadSink() {}virtual void onThreadCreate()  0;virtual void onThreadDestroy()  0;virtual void onThreadRun()  0;virtual void onThreadPause()  0;virtual void onThreadTask()  0;
};class IThread
{typedef enum{STAT_WAIT,STAT_RUN,STAT_PAUSE,STAT_QUIT}ThreadStat;public:virtual ~IThread() {}IThread(IThreadSink* _sink);void threadCreate();void threadDestroy();void run();void pause();
private:std::atomicint _stat_cur;std::atomicint _stat_set;std::thread _thread;IThreadSink* _sink;bool _is_init;void _threadTaskInternal();void _setStat(ThreadStat stat);
}; 
2. com_thread.c 
#include com_thread.hIThread::IThread(IThreadSink* sink):_stat_cur(STAT_WAIT),_stat_set(STAT_WAIT),_sink(NULL),_is_init(false)
{_sink  static_castIThreadSink*(sink);
}void IThread::threadCreate()
{if (_is_init){return;}_thread  std::thread(IThread::_threadTaskInternal, this);_is_init  true;
}
void IThread::threadDestroy()
{if (!_is_init){return;}_setStat(STAT_QUIT);_thread.join();_is_init  false;
}
void IThread::run()
{if (!_is_init){return;}if (_stat_cur  STAT_WAIT || _stat_cur  STAT_PAUSE){_setStat(STAT_RUN);if (_sink){_sink-onThreadRun();}}
}
void IThread::pause()
{if (!_is_init){return;}if (_stat_cur  STAT_RUN){_setStat(STAT_PAUSE);if (_sink){_sink-onThreadPause();}}
}void IThread::_threadTaskInternal()
{if (_sink){_sink-onThreadCreate();}while (1){if ((_stat_cur  STAT_WAIT || _stat_cur  STAT_PAUSE)  _stat_cur  _stat_set){std::this_thread::sleep_for(std::chrono::milliseconds(1));continue;}if (_stat_cur ! _stat_set){_stat_cur  _stat_set.load();}if (STAT_QUIT  _stat_cur){break;}if (STAT_WAIT  _stat_cur || STAT_PAUSE  _stat_cur){continue;}if (STAT_RUN  _stat_cur){_sink-onThreadTask();}}if (_sink){_sink-onThreadDestroy();}
}
void IThread::_setStat(ThreadStat stat)
{_stat_set  stat;while (_stat_cur  stat){std::this_thread::sleep_for(std::chrono::milliseconds(1));}
}3. demo.cpp 
#include iostream
#include com_thread.hclass ThreadTestDemo :public IThreadSink
{
public:virtual void onThreadCreate() override{std::cout  Create  std::endl;}virtual void onThreadDestroy() override{std::cout  Destroy  std::endl;}virtual void onThreadRun() override{std::cout  Run  std::endl;}virtual void onThreadPause() override{std::cout  Pause  std::endl;}virtual void onThreadTask() override{std::this_thread::sleep_for(std::chrono::milliseconds(100));std::cout  do task!!!  std::endl;}void test(){IThread* _thread  new IThread(this);_thread-threadCreate();std::this_thread::sleep_for(std::chrono::milliseconds(1000));for (int i  0; i  3; i){_thread-run();std::this_thread::sleep_for(std::chrono::milliseconds(1000));_thread-pause();std::this_thread::sleep_for(std::chrono::milliseconds(2000));}_thread-threadDestroy();delete _thread;}
};