• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            martin

            thinking

            常用鏈接

            統計

            software

            最新評論

            應用系統中的定時器設計

             在很多應用設計中,都設計了Timer(定時器), 用來完成特定的世間.例如在Symbian中就有一個CPeriodic類,它使用定時器對象來產生規則的定時器事件;在流媒體的應用Darwin中設計了定時器;在高效的中間件平臺ICE中也設計了Timer;在通信應用中我們必定要設計Timer來對特定的操作進行計時; 在一些應用中通過Timer來產生周期性的心跳,來確定系統中的各個服務器是否工作正常

            下面我們將分別介紹DarwinICE中的定時器:
            Darwin中的定時器設計:
            Task

            class Task

            {

            ……

            Private:

                        EventFlags      fEvents;                   //Task所對應的事件

            TaskThread*     fUseThisThread;   // 所對應的TaskThread.                              

            ……

            };

            TaskThread : Darwin中用來處理Task的線程.
            TaskThreadPool: Darwin中用來管理TaskThread的類.

            跟定時器有關的Task: TimeOutTask, IdleTask.

            TimeOutTask 包含一個Task的指針,并且含有一個指向TimeoutTaskThread的靜態指針,并且包含一個OSQueueElem,該OSQueueElem將被加到TimeoutTaskThread的隊列中.

            class TimeoutTask

            {

            ….

            private:

                        Task* fTask;

                        SInt64      fTimeoutAtThisTime;

                        SInt64      fTimeoutInMilSecs;   

            //for putting on our global queue of timeout tasks

                        OSQueueElem fQueueElem;

                        static TimeoutTaskThread*   sThread;  

            ……

            };
            IdleTask 公共繼承于 Task. 并且包含一個指向IdleTaskThread的靜態指針,并且包含一個OSHeapElem.  IdleTask 啟動IdleTaskThread.

            class IdleTask : public Task

            {

            public:

                        ……

                void SetIdleTimer(SInt64 msec) { sIdleThread->SetIdleTimer(this, msec); }

                void CancelTimeout() { sIdleThread->CancelTimeout(this); }

            private:

                OSHeapElem fIdleElem;

                static IdleTaskThread* sIdleThread;

            ……

            };

            TimeoutTaskThread 公共繼承 IdleTask

            class TimeoutTaskThread : public IdleTask

            {

            ……

             SInt64 TimeoutTaskThread::Run();

             ……

            };

            IdleTaskThread具有SetIdleTimer, CancelTimeout等方法.在這些方法中有IdleTaskactiveObj)作為參數.

            class IdleTaskThread : private OSThread

            {

            private:

                ……

                void SetIdleTimer(IdleTask *idleObj, SInt64 msec);

                void CancelTimeout(IdleTask *idleObj); 

                virtual void Entry();

                OSHeap fIdleHeap;

                OSMutex fHeapMutex;

            OSCond fHeapCond;

            ……

            };

            上面所介紹的,主要是些數據結構. 定時器設計的關鍵部分如下:

            IdleTaskThread中有一個OSHeap用來存儲不同的IdleTask;

             OSMutex用來對對象的同步訪問進行串行化;

             OSCond用來對對象進行Monitor.

            IdleTaskThreadSetIdleTimer方法中,調用fHeapCond.Signal()發出信號,激活在該條件上等待的線程.

            IdleTaskThreadEntry方法中檢查fIdleHeap.CurrentHeapSize(),如故為0,則等代: fHeapCond.Wait(&fHeapMutex), 直到有新的IdelTimer被加入.

            如果定時到了,則調用該IdleTask上的Signal(Task::kIdleEvent)方法,激活在該條件上等待的線程.然后調整等待時間, 重新進行等待: fHeapCond.Wait(&fHeapMutex, smallTime);

            ICE中的定時器設計:

            ICE中有一個Time類和Timer.

            Time中主要是定義一些對時間的轉換操作和比較操作等.

            Timer的定義如下:

            class ICE_UTIL_API Timer : public virtual IceUtil::Shared, private virtual IceUtil::Thread

            {

            public:

                        ……

                //

                // Schedule a task for execution after a given delay.

                //

                void schedule(const TimerTaskPtr&, const IceUtil::Time&);

                //

                // Schedule a task for repeated execution with the given delay

               // between each execution.

                //

                void scheduleRepeated(const TimerTaskPtr&, const IceUtil::Time&);

                //

                // Cancel a task. Returns true if the task has not yet run or if

                // it's a task scheduled for repeated execution. Returns false if

                // the task has already run, was already cancelled or was never

                // schedulded.

                //

                bool cancel(const TimerTaskPtr&);

            private:

                struct Token

                {

                    IceUtil::Time scheduledTime;

                    IceUtil::Time delay;

                    TimerTaskPtr task;

                    inline Token(const IceUtil::Time&, const IceUtil::Time&, const TimerTaskPtr&);

                    inline bool operator<(const Token& r) const;

                };

                virtual void run();

                IceUtil::Monitor<IceUtil::Mutex> _monitor;

                bool _destroyed;

                std::set<Token> _tokens;

                class TimerTaskCompare : public std::binary_function<TimerTaskPtr, TimerTaskPtr, bool>

                {

                public:

                    bool operator()(const TimerTaskPtr& lhs, const TimerTaskPtr& rhs) const

                    {

                        return lhs.get() < rhs.get();

                    }

                };

                std::map<TimerTaskPtr, IceUtil::Time, TimerTaskCompare> _tasks;

                IceUtil::Time _wakeUpTime;

            };

            該類public 繼承IceUtil::Shared, 表示它是一個共享的引用計數對象,可以使用智能指針. 該類public繼承IceUtil::Thread, 表明它為一個線程.

            Timerdestroy, schedule, scheduleRepeated 方法中調用_monitor.notify()方法,激活等待線程.

            Timer中有一個set(token) 和一個map( task).

            Timer線程的運行方式:

            在定時器的運做方式中,要用到Map, Set來記錄定時事件,并用Monitor對象來進行定時等待.

            TimerTask public 繼承于IceUtil::Shared, 并且要求提供一個runTimerTask的方法,該方法為純虛函數.

             

            ICE中的數據結構不同,但用來構造定時器的基本原理還是一致的.

            posted on 2009-03-17 17:34 martin_yahoo 閱讀(2507) 評論(2)  編輯 收藏 引用

            評論

            # re: 應用系統中的定時器設計 2009-03-18 15:01 KISS

            我為啥越來越不想使用C+做項目了呢,就是有太多程序員喜歡做出過度的設計.也不管是不是應該OO,先上來就N個CLASS包起,繼承起再說...
            簡單才是美.
              回復  更多評論   

            # re: 應用系統中的定時器設計 2009-03-18 15:45 martin_yahoo

            因為該代碼實例是從Drawin,ICE等應用中摘要而出,但這些系統可能為了系統的需要,進行了一些比較復雜的設計.其實你只要在意原理就行,也就是僅這一段即可:
            上面所介紹的,主要是些數據結構. 定時器設計的關鍵部分如下: ....  回復  更多評論   

            久久精品国产AV一区二区三区 | 久久一区二区免费播放| 99久久免费国产特黄| 国内精品久久久久久久久电影网 | 亚洲天堂久久久| 亚洲中文字幕久久精品无码APP| 精品国产乱码久久久久久人妻| 久久亚洲AV无码精品色午夜| 亚洲国产欧美国产综合久久| 久久A级毛片免费观看| 久久久久99精品成人片三人毛片 | 精品国产一区二区三区久久| 久久国产成人精品国产成人亚洲| 久久婷婷五月综合成人D啪 | 狠狠综合久久综合88亚洲| 91久久精一区二区三区大全| 亚洲а∨天堂久久精品9966| 亚洲国产精品无码久久一线| 四虎久久影院| 狠狠久久综合伊人不卡| 久久综合狠狠综合久久| 午夜精品久久久内射近拍高清 | 久久婷婷五月综合色99啪ak| 久久久久久精品成人免费图片| 久久99精品久久久久久不卡| 蜜臀久久99精品久久久久久小说 | 精品久久久久久无码中文字幕| 色婷婷综合久久久久中文一区二区 | 婷婷久久综合九色综合98| 人妻精品久久无码专区精东影业| 久久精品国产亚洲Aⅴ香蕉| 精品久久久无码21p发布| 亚洲国产综合久久天堂| 久久无码精品一区二区三区| 久久久久女教师免费一区| 亚洲午夜久久久精品影院| 99久久伊人精品综合观看| 国产精品午夜久久| 少妇被又大又粗又爽毛片久久黑人| 人妻丰满?V无码久久不卡| 国产99久久久国产精免费|