成人天堂666_91蜜桃麻豆_亚洲国产天堂久久综合_亚洲人精品_久久一级片视频_国产精品露脸高清86网站888

行業(yè)產(chǎn)品

  • 行業(yè)產(chǎn)品

杭州銳虎科技有限公司


當(dāng)前位置:杭州銳虎科技有限公司>技術(shù)文章>視頻監(jiān)控應(yīng)用中可伸縮的線程池設(shè)計
技術(shù)文章

視頻監(jiān)控應(yīng)用中可伸縮的線程池設(shè)計

閱讀:224發(fā)布時間:2011-10-27

視頻監(jiān)控應(yīng)用中可伸縮的線程池設(shè)計

      在撰寫本文前 我有選擇性的參考了目前網(wǎng)絡(luò)上對于線程池的介紹和實現(xiàn)的技術(shù)文章。結(jié)合自己實踐經(jīng)歷,做如下分條闡述。
 
一.依賴支持:基于通用線程基類。
    基于公司內(nèi)部的線程基礎(chǔ)庫。線程基類中zui為關(guān)鍵的是幾個虛繼承函數(shù)。
 
//所有的線程都必須重載此方法!!!
     virtual void RunBefor()=0;      //行動準(zhǔn)備
     virtual void RunAfter()=0;      //撤離準(zhǔn)備
     virtual void Run()=0;           //執(zhí)行體
 
其他由基類派生出來的子類 就可以而且必須實現(xiàn)這3個函數(shù)。
在繼承后的函數(shù)中 按照自己的功能要求來加以具體實現(xiàn)了。
 
二.架構(gòu)剖析:一個管理引擎線程,一群工作線程。
1     線程池要有個列表,來管理多個線程對象。
線程池只是一個架子,就像房子要有人才行。有人就會有事情產(chǎn)生和處理。
所謂的事情就是一個線程對象,具體線程的run函數(shù)就是事情的解決過程邏輯。
2    線程池要提供獲取空閑(IDLE)線程方法。
這個是非常必要的。一般獲取空閑可以用遍歷的法子。當(dāng)然在具體應(yīng)用中,“空閑”的概念也可以很豐富。比如用某某算法快速定位等等。這里就不展開了。
3    線程池中的線程,具體執(zhí)行的內(nèi)容,可自定義。
       線程池只是一個架子,提供一種模板化的處理建議。
至于具體一個新分配的線程究竟做什么,就看程序的應(yīng)用場景了。
4    線程池中的線程,使用完畢后,還能被收回,供下次使用。
所謂線程池,可以理解為一種思想。
就像一個水池,多進(jìn)多出罷了。需要就取,用完歸還。
5    重復(fù)和克隆機(jī)制按需使用。
在視頻監(jiān)控的應(yīng)用場合中,重復(fù)和克隆都是很常見且非常有效的處理思維。
重復(fù)為了減少無謂的開銷??寺榱思皶r的響應(yīng),否則在某一點接入時間點會導(dǎo)致無法接入的情況。相信寫服務(wù)器的朋友對此應(yīng)該都深有感觸把。
 
三.調(diào)度規(guī)則
1、線程的創(chuàng)建
      一般當(dāng)服務(wù)器接收到客戶端的請求后,會調(diào)用線程POOL的一個外調(diào)接口函數(shù)。
      外調(diào)函數(shù)根據(jù)條件判斷,遍歷綁定的隊列,看是否有相同的對象。如果有,則返回失敗。
      如果沒有,則用new操作新建一個線程對象,賦值并Resume。然后線程對象就經(jīng)有runbefor到run循環(huán)中執(zhí)行特定的處理邏輯,zui后經(jīng)由runafter退出線程。
2、任務(wù)分配策略及執(zhí)行過程
      一般在服務(wù)端的線程處理引擎中需要好幾個線程池合力協(xié)作。拿視頻監(jiān)控項目的實踐來說。
      至少會需要接入POOL,處理POOL,呼出POOL。它們每個POOL本身就是一個線程引擎。而相互之間的一般通過標(biāo)記位的方式進(jìn)行合理的串聯(lián),以達(dá)到流水工序化作業(yè)的目的。
      一個流程下來,就能非常好的體現(xiàn)出 任務(wù)分配的思想。有人負(fù)責(zé)接待,有人燒菜,有人端菜,有人負(fù)責(zé)中間協(xié)調(diào),有人收拾碗筷,有人送客。儼然一個飯店的流程。
3、線程的銷毀
      一般線程在主循環(huán)run中執(zhí)行自己的處理邏輯。一旦退出條件被觸發(fā),那么置位退出標(biāo)記為istobeclosed,然后自己空兜線程,就是僅僅sleep(10)然后直接返回。這個時候 負(fù)責(zé)管理引擎的線程 在查找線程狀態(tài)時候 發(fā)現(xiàn)這個線程想要退出。就調(diào)用線程基類的SetStopFlag(),讓線程退出去,再等待IsOutRun返回TRUE,再就是delete線程對象。
 
四.附錄代碼
(1)線程基類
     class CThread
     {
     public:
         CThread();
         CThreadbool suspend);
         virtual ~CThread();
 
         //以下是常見函數(shù)定義;
         HANDLE             GetHandle();
         int                GetID();
         int                GetGroupID();
         int                GetThreadID();
         string             GetNickName();
 
         void          SetIDint iID);
         void          SetGroupIDint iGroupID);
         void          SetNickNameconst string& sName);   
 
         //zhangxf 2010-01-28補(bǔ)充;
         void          SetNoSleep();
         void          SetSleepTimeint ivalue);
 
         void          Resume();          //啟動線程;
         void          Suspend();             //掛起線程;
         bool          Waitlong TimeToStop,bool bWaitAllTime=false);     //等待線程退出主循環(huán)體
         void          SetStopFlagbool IsStopFlag);//子類協(xié)同性退出
         bool          GetStopFlag();//獲取退出標(biāo)記
 
         bool          IsDead();//線程是否僵死
         DWORD              GetLastRunTime();//獲取上次循環(huán)體進(jìn)入時間
         DWORD              GetLastSuspendedTime();//獲取上次掛起時間
         DWORD              GetLastResumeTime();//獲取上次喚醒時間
 
         bool          IsSuspended();
 
        bool            IsOutOfRun();
 
         void          Terminate();//強(qiáng)制退出
 
         //獲取錯誤碼
         int                GetLastError() const {return m_ErrorCode;}
 
          //所有的線程都必須重載此方法!!!
         virtual void RunBefor()=0;      //行動準(zhǔn)備
         virtual void RunAfter()=0;      //撤離準(zhǔn)備
         virtual void Run()=0;           //執(zhí)行體
 
         void MainRun();
 
     protected:
         static unsigned   _stdcall ThreadEntryLPVOID lpParam);
 
     private:
         HANDLE             m_hThread;             //線程句柄
         int                m_ID;
         int                m_ThreadID;            //線程ID
         int                m_GroupID;             //線程組別;
         string             m_NickName;            //線程名稱;  
 
         DWORD              m_LastRunTime;         //上次循環(huán)體進(jìn)入時間
         DWORD              m_LastSuspendedTime;//上次掛起的時間
         DWORD              m_LastResumeTime//上次喚醒的時間
 
         bool          m_IsSuspended;          //目前線程的狀態(tài)是否掛起;
         int                m_ErrorCode;
 
         bool          m_IsTerminated;        //線程是否終止
         bool          m_IsOutOfRun;      //是否退出了主循環(huán)
 
         int                m_SleepTime;       //設(shè)置sleep的秒數(shù);
     };
 
 
(2)線程池參考范例
//視頻發(fā)送線程
class CVideoSend : public CThread
{
public:
    CVideoSendbool    CreateSuspended);
    ~CVideoSend();
    void                RunBefor();
    void                RunAfter();
    void                Run();
public:
     bool               _RunProc();                      //加返回值gzb 2010-09-08
     void               _RunBefor();                //內(nèi)部函數(shù)
public:
void                BindingCPublicInfo*        _PublicInfo);
void                BindingCVideoSendPool*    _VideoSendPool);
public:
    CPublicInfo*        m_Binding_PublicInfo;      //由publicinfo綁定路由列表
    CVideoSendPool*     m_Binding_VideoSendPool;   //綁定發(fā)送線程pool
public:
     CVideoShare*       m_Binding_VideoShare;       //綁定   視頻共享內(nèi)存區(qū)指針。
     CNetContext*        m_Binding_TContext;            //綁定請求的包文
     CNetTCPClient*      m_Package_NetClient;       //包裝一個CNetTCPClient,沒有實質(zhì)的去新建。
 
     int                    m_WriteIndex;               //
     DWORD                  m_WriteTime;                //
 
    CCmdContext*        m_CmdContext;               //請求包文指針-----------------------
    SOCKET              m_SocketID;                 //SocketID
    string              m_ClientIP;                 //客戶端IP
    WORK_STATE          m_WorkState;                //狀態(tài)
     string                 m_GUID;                          //*標(biāo)記。gzb 2010-08-26
};
typedef std::list<CVideoSend*> _CVideoSendList;
////
class CVideoSendPool : public    _CVideoSendList,public CThread
{
public:
    CVideoSendPoolbool    CreateSuspended);
    ~CVideoSendPool();
    void                RunBefor();
    void                RunAfter();
    void                Run();
public:
     void               _RunProc();
public:
    //取空閑線程;
    void                BindingCPublicInfo*        _PublicInfo);
    void                _FindNoLivingAndDelete();                                        //定期清理
    void                _PrintfPoolInfo();
public:
     bool               NL_StartSendVideo();
 
     bool               out_RequestForVideo();
public:
    CPublicInfo*        m_Binding_PublicInfo;                                            //
};
 
 銳虎科技  研發(fā)部
        銳虎科技,專注安防監(jiān)控平臺軟件設(shè)計

智慧城市網(wǎng) 設(shè)計制作,未經(jīng)允許翻錄必究 .? ? ? Copyright(C)?2021 http://m.zvwid.cn,All rights reserved.

以上信息由企業(yè)自行提供,信息內(nèi)容的真實性、準(zhǔn)確性和合法性由相關(guān)企業(yè)負(fù)責(zé),智慧城市網(wǎng)對此不承擔(dān)任何保證責(zé)任。 溫馨提示:為規(guī)避購買風(fēng)險,建議您在購買產(chǎn)品前務(wù)必確認(rèn)供應(yīng)商資質(zhì)及產(chǎn)品質(zhì)量。

會員登錄

×

請輸入賬號

請輸入密碼

=

請輸驗證碼

收藏該商鋪

登錄 后再收藏

提示

您的留言已提交成功!我們將在第一時間回復(fù)您~
主站蜘蛛池模板: 69精品人人人人 | 日韩精品东京热无码视频播放 | 亚洲精品二三区 | 91久久精品一区二区三区 | 精品十八禁免费观看 | 夜草av | 国产精品社区在线观看 | 日本在线不卡一区二区三区 | 国产精品成人VA在线播放 | 国产99视频精品免费观看6 | 一区二区三区在线播放 | 成人一区二区三区四区 | av在线播放观看 | 在线视频一二三区 | 韩国日本一区二区三区 | 久久久国产精品免费观看 | 激情一区二区 | 欧美大片久久国产欧美日韩精品 | 国产欧美在线播放视频 | 成年免费大片黄在线观看片 | 亚洲精品成人免费 | 欧美久久久久久久久 | 亚洲一二区精品 | 国产碰在79香蕉人人澡人人看喊 | 免费看aaaaa级少淫片 | 99re伊人| 亚洲精品一区二区三区在线观看 | 日本一区二区三区精品 | 亚洲国产乱人在线观看 | 国产白白白在线永久播放 | 92福利视频1000免费 | 国产午夜一级在线观看影院 | 精品久久久久久久久久久久久久久 | 国产三级农村妇女做受 | 亚洲成人免费在线 | 国产片一区二区三区 | 国产九色在线播放九色 | 午夜嘿咻 | 国产精品一区自拍 | 亚洲国产成人精品久久 | 毛片免费视频在线观看 |