timer.h
上传用户:hzhsqp
上传日期:2007-01-06
资源大小:1600k
文件大小:9k
源码类别:

IP电话/视频会议

开发平台:

Visual C++

  1. /*
  2.  * timer.h
  3.  *
  4.  * Real time down counting time interval class.
  5.  *
  6.  * Portable Windows Library
  7.  *
  8.  * Copyright (c) 1993-1998 Equivalence Pty. Ltd.
  9.  *
  10.  * The contents of this file are subject to the Mozilla Public License
  11.  * Version 1.0 (the "License"); you may not use this file except in
  12.  * compliance with the License. You may obtain a copy of the License at
  13.  * http://www.mozilla.org/MPL/
  14.  *
  15.  * Software distributed under the License is distributed on an "AS IS"
  16.  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
  17.  * the License for the specific language governing rights and limitations
  18.  * under the License.
  19.  *
  20.  * The Original Code is Portable Windows Library.
  21.  *
  22.  * The Initial Developer of the Original Code is Equivalence Pty. Ltd.
  23.  *
  24.  * Portions are Copyright (C) 1993 Free Software Foundation, Inc.
  25.  * All Rights Reserved.
  26.  *
  27.  * Contributor(s): ______________________________________.
  28.  *
  29.  * $Log: timer.h,v $
  30.  * Revision 1.18  2000/01/06 14:09:42  robertj
  31.  * Fixed problems with starting up timers,losing up to 10 seconds
  32.  *
  33.  * Revision 1.17  1999/03/09 02:59:51  robertj
  34.  * Changed comments to doc++ compatible documentation.
  35.  *
  36.  * Revision 1.16  1999/02/16 08:11:17  robertj
  37.  * MSVC 6.0 compatibility changes.
  38.  *
  39.  * Revision 1.15  1998/09/23 06:21:45  robertj
  40.  * Added open source copyright license.
  41.  *
  42.  * Revision 1.14  1996/12/21 07:57:22  robertj
  43.  * Fixed possible deadlock in timers.
  44.  *
  45.  * Revision 1.13  1996/05/18 09:18:37  robertj
  46.  * Added mutex to timer list.
  47.  *
  48.  * Revision 1.12  1995/06/17 11:13:36  robertj
  49.  * Documentation update.
  50.  *
  51.  * Revision 1.11  1995/04/02 09:27:34  robertj
  52.  * Added "balloon" help.
  53.  *
  54.  * Revision 1.10  1995/03/14 12:42:51  robertj
  55.  * Updated documentation to use HTML codes.
  56.  *
  57.  * Revision 1.9  1995/01/18  09:01:06  robertj
  58.  * Added notifiers to timers.
  59.  * Documentation.
  60.  *
  61.  * Revision 1.8  1994/08/23  11:32:52  robertj
  62.  * Oops
  63.  *
  64.  * Revision 1.7  1994/08/22  00:46:48  robertj
  65.  * Added pragma fro GNU C++ compiler.
  66.  *
  67.  * Revision 1.6  1994/07/02  03:03:49  robertj
  68.  * Redesign of timers.
  69.  *
  70.  * Revision 1.5  1994/06/25  11:55:15  robertj
  71.  * Unix version synchronisation.
  72.  *
  73.  * Revision 1.4  1994/03/07  07:38:19  robertj
  74.  * Major enhancementsacross the board.
  75.  *
  76.  * Revision 1.3  1994/01/03  04:42:23  robertj
  77.  * Mass changes to common container classes and interactors etc etc etc.
  78.  *
  79.  * Revision 1.2  1993/08/31  03:38:02  robertj
  80.  * Added missing virtual on destructor.
  81.  *
  82.  * Revision 1.1  1993/08/27  18:17:47  robertj
  83.  * Initial revision
  84.  *
  85.  */
  86. #define _PTIMER
  87. #ifdef __GNUC__
  88. #pragma interface
  89. #endif
  90. class PThread;
  91. /**
  92.    A class representing a system timer. The time interval ancestor value is
  93.    the amount of time left in the timer.
  94.    A timer on completion calls the virtual function #OnTimeout()#. This
  95.    will in turn call the callback function provided by the instance. The user
  96.    may either override the virtual function or set a callback as desired.
  97.    
  98.    Note that only one timeout function can be executed at a time. The timeout
  99.    function is also executed in the context of the #PProcess# instances
  100.    thread of execution.
  101.    
  102.    A list of active timers is maintained by the applications #PProcess# 
  103.    instance. This is used for sstealing the processor time to decrement the
  104.    timers and call the timeout functions. A consequence of this is that no
  105.    static timer instances can be running when the program terminates.
  106.  */
  107. class PTimer : public PTimeInterval
  108. {
  109.   PCLASSINFO(PTimer, PTimeInterval);
  110.   public:
  111.   /**@name Construction */
  112.   //@{
  113.     /** Create a new timer object and start it in one shot mode for the
  114.        specified amount of time. If the time was zero milliseconds then the
  115.        timer is {bf not} started, ie the callback function is not executed
  116.        immediately.
  117.       */
  118.     PTimer(
  119.       long milliseconds = 0,  /// Number of milliseconds for timer.
  120.       int seconds = 0,        /// Number of seconds for timer.
  121.       int minutes = 0,        /// Number of minutes for timer.
  122.       int hours = 0,          /// Number of hours for timer.
  123.       int days = 0            /// Number of days for timer.
  124.     );
  125.     PTimer(
  126.       const PTimeInterval & time    /// New time interval for timer.
  127.     );
  128.     /** Restart the timer in one shot mode using the specified time value. If
  129.        the timer was already running, the "time left" is simply reset.
  130.        @return
  131.        reference to the timer.
  132.      */
  133.     PTimer & operator=(
  134.       DWORD milliseconds            /// New time interval for timer.
  135.     );
  136.     PTimer & operator=(
  137.       const PTimeInterval & time    /// New time interval for timer.
  138.     );
  139.     /** Destroy the timer object, removing it from the applications timer list
  140.        if it was running.
  141.      */
  142.     virtual ~PTimer();
  143.   //@}
  144.   /**@name Control functions */
  145.   //@{
  146.     /** Start a timer in continous cycle mode. Whenever the timer runs out it
  147.        is automatically reset to the time specified. Thus, it calls the
  148.        notification function every time interval.
  149.      */
  150.     void RunContinuous(
  151.       const PTimeInterval & time    // New time interval for timer.
  152.     );
  153.     /** Stop a running timer. The imer will not call the notification function
  154.        and is reset back to the original timer value. Thus when the timer
  155.        is restarted it begins again from the beginning.
  156.      */
  157.     void Stop();
  158.     /** Determine if the timer is currently running. This really is only useful
  159.        for one shot timers as repeating timers are always running.
  160.        
  161.        @return
  162.        TRUE if timer is still counting.
  163.      */
  164.     BOOL IsRunning() const;
  165.     /** Pause a running timer. This differs from the #Stop()# function in
  166.        that the timer may be resumed at the point that it left off. That is
  167.        time is "frozen" while the timer is paused.
  168.      */
  169.     void Pause();
  170.     /** Restart a paused timer continuing at the time it was paused. The time
  171.        left at the moment the timer was paused is the time until the next
  172.        call to the notification function.
  173.      */
  174.     void Resume();
  175.     /** Determine if the timer is currently paused.
  176.        @return
  177.        TRUE if timer paused.
  178.      */
  179.     BOOL IsPaused() const;
  180.   //@}
  181.   /**@name Notification functions */
  182.   //@{
  183.     /**This function is called on time out. That is when the system timer
  184.        processing decrements the timer from a positive value to less than or
  185.        equal to zero. The interval is then reset to zero and the function
  186.        called.
  187.        
  188.        The default behaviour of this function is to call the #PNotifier# 
  189.        callback function.
  190.      */
  191.     virtual void OnTimeout();
  192.     /** Get the current call back function that is called whenever the timer
  193.        expires. This is called by the #OnTimeout()# function.
  194.        @return
  195.        current notifier for the timer.
  196.      */
  197.     const PNotifier & GetNotifier() const;
  198.     /** Set the call back function that is called whenever the timer expires.
  199.        This is called by the #OnTimeout()# function.
  200.      */
  201.     void SetNotifier(
  202.       const PNotifier & func  // New notifier function for the timer.
  203.     );
  204.   //@}
  205.   /**@name Global real time functions */
  206.   //@{
  207.     /** Get the number of milliseconds since some arbtrary point in time. This
  208.        is a platform dependent function that yields a real time counter.
  209.        
  210.        Note that even though this function returns milliseconds, the value may
  211.        jump in minimum quanta according the platforms timer system, eg under
  212.        MS-DOS and MS-Windows the values jump by 55 every 55 milliseconds. The
  213.        #Resolution()# function may be used to determine what the minimum
  214.        time interval is.
  215.     
  216.        @return
  217.        millisecond counter.
  218.      */
  219.     static PTimeInterval Tick();
  220.     /** Get the smallest number of milliseconds that the timer can be set to.
  221.        All actual timing events will be rounded up to the next value. This is
  222.        typically the platforms internal timing units used in the #Tick()#
  223.        function.
  224.        
  225.        @return
  226.        minimum number of milliseconds per timer "tick".
  227.      */
  228.     static unsigned Resolution();
  229.   //@}
  230.   private:
  231.     void StartRunning(
  232.       BOOL once   // Flag for one shot or continuous.
  233.     );
  234.     /* Start or restart the timer from the #resetTime# variable.
  235.        This is an internal function.
  236.      */
  237.     BOOL Process(
  238.       const PTimeInterval & delta,    // Time interval since last call.
  239.       PTimeInterval & minTimeLeft     // Minimum time left till next timeout.
  240.     );
  241.     /* Process the timer decrementing it by the delta amount and calling the
  242.        #OnTimeout()# when zero. This is used internally by the
  243.        #PTimerList::Process()# function.
  244.        @return
  245.        TRUE if is no longer running.
  246.      */
  247.   // Member variables
  248.     PNotifier callback;
  249.     // Callback function for expired timers.
  250.     PTimeInterval resetTime;
  251.     // The time to reset a timer to when RunContinuous() is called.
  252.     BOOL oneshot;
  253.     // Timer operates once then stops.
  254.     enum { Stopped, Starting, Running, Paused } state;
  255.     // Timer state.
  256.     PThread * timeoutThread;
  257.     /* Timer is currently executing its OnTimeout() function. This is to
  258.        prevent recursive calls when timer is in free running mode.
  259.      */
  260.   friend class PTimerList;
  261.   
  262. #ifdef DOC_PLUS_PLUS
  263. };
  264. #endif
  265.   
  266. // Class declaration continued in platform specific header file ///////////////