• <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

            常用鏈接

            統(tǒng)計(jì)

            software

            最新評(píng)論

            應(yīng)用系統(tǒng)中的定時(shí)器設(shè)計(jì)

             在很多應(yīng)用設(shè)計(jì)中,都設(shè)計(jì)了Timer(定時(shí)器), 用來(lái)完成特定的世間.例如在Symbian中就有一個(gè)CPeriodic類,它使用定時(shí)器對(duì)象來(lái)產(chǎn)生規(guī)則的定時(shí)器事件;在流媒體的應(yīng)用Darwin中設(shè)計(jì)了定時(shí)器;在高效的中間件平臺(tái)ICE中也設(shè)計(jì)了Timer;在通信應(yīng)用中我們必定要設(shè)計(jì)Timer來(lái)對(duì)特定的操作進(jìn)行計(jì)時(shí); 在一些應(yīng)用中通過(guò)Timer來(lái)產(chǎn)生周期性的心跳,來(lái)確定系統(tǒng)中的各個(gè)服務(wù)器是否工作正常

            下面我們將分別介紹DarwinICE中的定時(shí)器:
            Darwin中的定時(shí)器設(shè)計(jì):
            Task

            class Task

            {

            ……

            Private:

                        EventFlags      fEvents;                   //Task所對(duì)應(yīng)的事件

            TaskThread*     fUseThisThread;   // 所對(duì)應(yīng)的TaskThread.                              

            ……

            };

            TaskThread : Darwin中用來(lái)處理Task的線程.
            TaskThreadPool: Darwin中用來(lái)管理TaskThread的類.

            跟定時(shí)器有關(guān)的Task: TimeOutTask, IdleTask.

            TimeOutTask 包含一個(gè)Task的指針,并且含有一個(gè)指向TimeoutTaskThread的靜態(tài)指針,并且包含一個(gè)OSQueueElem,該OSQueueElem將被加到TimeoutTaskThread的隊(duì)列中.

            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. 并且包含一個(gè)指向IdleTaskThread的靜態(tài)指針,并且包含一個(gè)OSHeapElem.  IdleTask 啟動(dòng)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)作為參數(shù).

            class IdleTaskThread : private OSThread

            {

            private:

                ……

                void SetIdleTimer(IdleTask *idleObj, SInt64 msec);

                void CancelTimeout(IdleTask *idleObj); 

                virtual void Entry();

                OSHeap fIdleHeap;

                OSMutex fHeapMutex;

            OSCond fHeapCond;

            ……

            };

            上面所介紹的,主要是些數(shù)據(jù)結(jié)構(gòu). 定時(shí)器設(shè)計(jì)的關(guān)鍵部分如下:

            IdleTaskThread中有一個(gè)OSHeap用來(lái)存儲(chǔ)不同的IdleTask;

             OSMutex用來(lái)對(duì)對(duì)象的同步訪問(wèn)進(jìn)行串行化;

             OSCond用來(lái)對(duì)對(duì)象進(jìn)行Monitor.

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

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

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

            ICE中的定時(shí)器設(shè)計(jì):

            ICE中有一個(gè)Time類和Timer.

            Time中主要是定義一些對(duì)時(shí)間的轉(zhuǎn)換操作和比較操作等.

            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, 表示它是一個(gè)共享的引用計(jì)數(shù)對(duì)象,可以使用智能指針. 該類public繼承IceUtil::Thread, 表明它為一個(gè)線程.

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

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

            Timer線程的運(yùn)行方式:

            在定時(shí)器的運(yùn)做方式中,要用到Map, Set來(lái)記錄定時(shí)事件,并用Monitor對(duì)象來(lái)進(jìn)行定時(shí)等待.

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

             

            ICE中的數(shù)據(jù)結(jié)構(gòu)不同,但用來(lái)構(gòu)造定時(shí)器的基本原理還是一致的.

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

            評(píng)論

            # re: 應(yīng)用系統(tǒng)中的定時(shí)器設(shè)計(jì) 2009-03-18 15:01 KISS

            我為啥越來(lái)越不想使用C+做項(xiàng)目了呢,就是有太多程序員喜歡做出過(guò)度的設(shè)計(jì).也不管是不是應(yīng)該OO,先上來(lái)就N個(gè)CLASS包起,繼承起再說(shuō)...
            簡(jiǎn)單才是美.
              回復(fù)  更多評(píng)論   

            # re: 應(yīng)用系統(tǒng)中的定時(shí)器設(shè)計(jì) 2009-03-18 15:45 martin_yahoo

            因?yàn)樵摯a實(shí)例是從Drawin,ICE等應(yīng)用中摘要而出,但這些系統(tǒng)可能為了系統(tǒng)的需要,進(jìn)行了一些比較復(fù)雜的設(shè)計(jì).其實(shí)你只要在意原理就行,也就是僅這一段即可:
            上面所介紹的,主要是些數(shù)據(jù)結(jié)構(gòu). 定時(shí)器設(shè)計(jì)的關(guān)鍵部分如下: ....  回復(fù)  更多評(píng)論   


            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            久久久久高潮毛片免费全部播放| 人人狠狠综合久久亚洲婷婷| 性做久久久久久久久久久| 久久久久亚洲av成人网人人软件| 狠狠色丁香婷婷久久综合| 久久香蕉国产线看观看99| 99久久99久久精品国产片果冻| 久久国产精品久久久| 久久久久久久综合日本| 国产精品视频久久| 久久婷婷色综合一区二区| 国产午夜精品理论片久久| 99999久久久久久亚洲| 国产精品亚洲综合久久| A级毛片无码久久精品免费| 人妻精品久久久久中文字幕69| 久久久久人妻一区精品果冻| 久久婷婷激情综合色综合俺也去 | 久久夜色精品国产欧美乱| 亚洲国产精品无码久久青草| 品成人欧美大片久久国产欧美...| 日本人妻丰满熟妇久久久久久| 亚洲国产成人久久一区久久| 久久精品国产亚洲AV不卡| 久久线看观看精品香蕉国产| AV色综合久久天堂AV色综合在| 色8激情欧美成人久久综合电| 久久久精品日本一区二区三区| 一本色道久久88加勒比—综合| 99热成人精品热久久669| 久久国产精品成人影院| 精品久久久无码人妻中文字幕豆芽| 久久精品国产久精国产一老狼| 久久亚洲精品无码aⅴ大香| 青青热久久国产久精品 | 很黄很污的网站久久mimi色| yellow中文字幕久久网| 精品视频久久久久| 欧美日韩精品久久久免费观看| 久久精品综合网| 久久免费的精品国产V∧|