File: UTILS\U_TIMER.CPP

    1 //#############################################################################
    2 //                                                                           //
    3 // U_TIMER.CPP                                                               //
    4 // Subsystem: Utilities - Timer                                              //
    5 // Deklaration: U_TIMER.H                                                    //
    6 //---------------------------------------------------------------------------//
    7 // Autoren: Thomas Kullmann, Günther Reinecker                               //
    8 // Stand:   01.12.2002                                                       //
    9 //                                                                           //
   10 //#############################################################################
   11 
   12 #include <stdlib.h> // für: min(), max()
   13 
   14 #include "utils\u_timer.h" // SCHNITTSTELLE für diese Datei
   15 
   16 //--||--\\--||--//--||--\\--||--//--||--\\--||--//--||--\\--||--//--||--\\--||--
   17 
   18 //##############################################################################
   19 //                                     TBasicTimer                            //
   20 //##############################################################################
   21 
   22 TBasicTimer::TBasicTimer ( const UINT aDelay )
   23 {
   24         //Intervallgrenzen ermitteln
   25         if (timeGetDevCaps( &m_Tc, sizeof( TIMECAPS ) ) != TIMERR_NOERROR)
   26         {
   27                 m_Tc.wPeriodMin= 0;
   28                 m_Tc.wPeriodMax= 0;
   29         }
   30 
   31         m_Delay= max( m_Tc.wPeriodMin, min( aDelay, m_Tc.wPeriodMax )); //ggf. 0 !!!
   32         m_WantTimer= FALSE;
   33 };
   34 
   35 //------------------------------------------------------------------------------
   36 
   37 UINT TBasicTimer::GetDelay ( void )
   38 {
   39         return m_Delay;
   40 };
   41 //------------------------------------------------------------------------------
   42 
   43 UINT TBasicTimer::SetDelay ( const UINT aDelay )
   44 {
   45         if ( m_Delay )
   46                 return 0; //wenn Intervallgrenzen nicht ermittelt werden konnten
   47 
   48         m_Delay= max( m_Tc.wPeriodMin, min( aDelay, m_Tc.wPeriodMax ) ); //Sollintervall ins Intervall einpassen
   49         return m_Delay;
   50 };
   51 //******************************************************************************
   52 // start/ stop
   53 //******************************************************************************
   54 
   55 BOOL TBasicTimer::StartTimer ( const UINT aDelay )
   56 {
   57         SetDelay(aDelay);
   58         return StartTimer();
   59 };
   60 //------------------------------------------------------------------------------
   61 
   62 BOOL TBasicTimer::StartTimer ( void )
   63 {
   64         m_WantTimer= Start();
   65         return m_WantTimer;
   66 };
   67 //------------------------------------------------------------------------------
   68 
   69 void TBasicTimer::StopTimer ( void )
   70 {
   71         Stop();
   72         m_WantTimer= FALSE;
   73 };
   74 
   75 //******************************************************************************
   76 // start/ stop ( + Ereignis sofort auslösen)
   77 //******************************************************************************
   78 
   79 BOOL TBasicTimer::StartTimerIm ( void )
   80 {
   81         BOOL result= StartTimer();
   82         Immediately(); // auch aufrufen, wenn Timer nicht gestartet werden konnte
   83         return result;
   84 };
   85 //------------------------------------------------------------------------------
   86 
   87 BOOL TBasicTimer::StartTimerIm ( const UINT aDelay)
   88 {
   89         BOOL result= StartTimer(aDelay);
   90         Immediately(); // auch aufrufen, wenn Timer nicht gestartet werden konnte
   91         return result;
   92 };
   93 //------------------------------------------------------------------------------
   94 
   95 void TBasicTimer::StopTimerIm ( void )
   96 {
   97         m_WantTimer= FALSE; // bei Immediately nicht neu starten
   98         Immediately();
   99         StopTimer();
  100 };
  101 //------------------------------------------------------------------------------
  102 
  103 void TBasicTimer::Immediately ( void )
  104 {
  105         Stop();
  106         OnTimer(this);
  107         if ( m_WantTimer )
  108                 Start(); //könnte in OnTimer FALSE gesetzt worden sein
  109 };
  110 
  111 //##############################################################################
  112 //                                     TTimer16                               //
  113 //##############################################################################
  114 
  115 TIndList TTimer16::s_TimerList(true, true, false, true); 
  116 
  117 //------------------------------------------------------------------------------
  118 
  119 TTimer16::TTimer16 ( const UINT aDelay ) : TBasicTimer( aDelay )
  120 {
  121         m_TimerID= 0; //bislang nicht gestartet
  122 };
  123 //------------------------------------------------------------------------------
  124 
  125 TTimer16::~TTimer16 ( void )
  126 {
  127         StopTimer(); //Timer stoppen
  128 };
  129 //------------------------------------------------------------------------------
  130 
  131 BOOL TTimer16::IsStarted ( void )
  132 {
  133         return (m_TimerID != 0);
  134 };
  135 //------------------------------------------------------------------------------
  136 
  137 BOOL TTimer16::Start ( void )
  138 {
  139         if ( m_Delay == 0 )
  140                 return FALSE; //wenn Intervallgrenzen nicht ermittelt werden konnten
  141 
  142         Stop(); // alten Timer stoppen
  143         m_TimerID= SetTimer( NULL, 123, m_Delay, (TIMERPROC) & TTimer16::TimedEvent );
  144         if ( !IsStarted() )
  145                 return FALSE;
  146 
  147         // zur Liste der gestarteten Timer hinzufügen
  148         s_TimerList.Append(this);
  149         return TRUE;
  150 };
  151 //------------------------------------------------------------------------------
  152 
  153 void TTimer16::Stop ( void )
  154 {
  155         if ( !IsStarted() )
  156                 return;
  157 
  158         KillTimer( NULL, m_TimerID );
  159         m_TimerID= NULL; // Timer ist gestoppt
  160         // aus der Liste der gestarteten Timer entfernen
  161         s_TimerList.RemoveData(this);
  162 };
  163 //------------------------------------------------------------------------------
  164 
  165 void CALLBACK TTimer16::TimedEvent ( HWND, UINT, UINT aTimerID, DWORD )
  166 {
  167         // Objekt aus der Liste der gestarteten Timer ermitteln; damit endlich auch Zugriff auf Member
  168         TTimer16 *self= 0;
  169         for (TIndex i= 0; (i<s_TimerList.GetCount() && !self ); i++) {
  170                 TTimer16 *act= (TTimer16 *)s_TimerList[i];
  171                 if ( act && act->m_TimerID==aTimerID ) self= act; // gefunden :-)
  172         }
  173         if ( !self ) { // nicht in der Liste :-(
  174                 const char prae[]= "Unbekannte TIMER-Botschaft für ID= %d !";
  175                 char *buf= new char[ strlen(prae) + _MAXLENDOUBLE + 1 ];
  176                 sprintf(buf, prae, aTimerID);
  177                 TraceErr(buf);
  178                 _FREELIST(buf);
  179                 return; 
  180         }               
  181 
  182         self->Stop();
  183         self->OnTimer( self );
  184         if ( self->m_WantTimer )
  185                 self->Start(); // <m_WantTimer> könnte in OnTimer FALSE gesetzt worden sein
  186 };
  187 
  188 //##############################################################################
  189 //                                     TTimerMM                               //
  190 //##############################################################################
  191 
  192 TTimerMM::TTimerMM ( const UINT aDelay ) : TBasicTimer( aDelay )
  193 {
  194         m_TimerID= 0; //bislang nicht gestartet
  195 };
  196 //------------------------------------------------------------------------------
  197 
  198 TTimerMM::~TTimerMM ( void )
  199 {
  200         StopTimer(); //Timer stoppen
  201 };
  202 //------------------------------------------------------------------------------
  203 
  204 BOOL TTimerMM::IsStarted ( void )
  205 {
  206         return (m_TimerID != 0);
  207 };
  208 //------------------------------------------------------------------------------
  209 
  210 BOOL TTimerMM::Start ( void )
  211 {
  212         if ( m_Delay == 0 )
  213                 return FALSE; //wenn Intervallgrenzen nicht ermittelt werden konnten
  214 
  215         StopTimer(); //Timer stoppen
  216         m_TimerID= timeSetEvent( m_Delay, m_Tc.wPeriodMin, &TTimerMM::TimedEvent, (DWORD)this, TIME_PERIODIC ); //gibt 0 zurück, falls Timer nict gestartet werden konnte
  217         return IsStarted();
  218 };
  219 //------------------------------------------------------------------------------
  220 
  221 void TTimerMM::Stop ( void )
  222 {
  223         if ( IsStarted() )
  224                 timeKillEvent( m_TimerID );
  225         m_TimerID= 0; //Timer ist gestoppt
  226 };
  227 //------------------------------------------------------------------------------
  228 
  229 void CALLBACK TTimerMM::TimedEvent ( UINT, UINT, DWORD dwUser, DWORD, DWORD )
  230 {
  231         TTimerMM *self= (TTimerMM*)dwUser; //damit endlich auch Zugriff auf Member
  232 
  233         self->Stop();
  234         self->OnTimer( self ); //solange diese Methode rechnet, kann OnTimer nicht erneut aufgerufen werden: deshalb Timer stoppen und neu starten
  235         if ( self->m_WantTimer )
  236                 self->Start(); //könnte in OnTimer FALSE gesetzt worden sein
  237 };
  238 
  239 //##############################################################################
  240 // TInterfaceTimer
  241 //##############################################################################
  242 
  243 TInterfaceTimer::TInterfaceTimer ( ITimer *aInterface, const UINT aDelay ) : TTimer( aDelay )
  244 {
  245         m_lnkInterface= aInterface;
  246 };
  247 //------------------------------------------------------------------------------
  248 
  249 void TInterfaceTimer::OnTimer ( TBasicTimer *const aTimer )
  250 {
  251         if ( m_lnkInterface )
  252                 m_lnkInterface->OnTimer(aTimer);
  253 };
  254 
  255 //##############################################################################
  256 // TWindowTimer
  257 //##############################################################################
  258 
  259 TWindowTimer::TWindowTimer ( HWND aWnd, const UINT aDelay ) : TTimer( aDelay )
  260 {
  261         m_lnkWnd= aWnd;
  262 };
  263 //------------------------------------------------------------------------------
  264 
  265 void TWindowTimer::OnTimer ( TBasicTimer *const )
  266 {
  267         if ( m_lnkWnd )
  268                 SendMessage( m_lnkWnd, WM_TIMER, 0, 0 ); //wartet solange bis die Botschaft verarbeitet wurde
  269 };
  270 
  271 //##############################################################################
  272 // LASTLINE
  273 //##############################################################################
  274