void CMUSHclientDoc::ResetOneTimer (CTimer * timer_item) { CmcDateTime tNow = CmcDateTime::GetTimeNow(); CmcDateTimeSpan tsOneDay (1, 0, 0, 0); if (!timer_item->bEnabled) // ignore un-enabled timers return; // so we can see when it is likely to fire next timer_item->tWhenFired = tNow; // for timers that go off "at" a time, find today's date, and move the time in if (timer_item->iType == CTimer::eAtTime) { timer_item->tFireTime = CmcDateTime (tNow.GetYear (), tNow.GetMonth (), tNow.GetDay (), timer_item->iAtHour, timer_item->iAtMinute, timer_item->fAtSecond); // if this time has passed, go onto tomorrow if (timer_item->tFireTime < tNow) timer_item->tFireTime += tsOneDay; } else // for periodic timers, find "now" and add the period to it timer_item->tFireTime = tNow + CmcDateTimeSpan (0, // now plus the interval timer_item->iEveryHour, timer_item->iEveryMinute, timer_item->fEverySecond) - CmcDateTimeSpan (0, // minus the offset timer_item->iOffsetHour, timer_item->iOffsetMinute, timer_item->fOffsetSecond); } // end of CMUSHclientDoc::ResetOneTimer
CmcDateTime CmcDateTime::GetTimeNow () { static bool bFirstTime = true; static CmcDateTime last_date; static LARGE_INTEGER last_time; static LONGLONG iCounterFrequency = 0; if (bFirstTime) { bFirstTime = false; LARGE_INTEGER large_int_frequency; if (QueryPerformanceFrequency (&large_int_frequency)) { iCounterFrequency = large_int_frequency.QuadPart; QueryPerformanceCounter (&last_time); } } double secs = 0; LARGE_INTEGER time_now; if (iCounterFrequency) { QueryPerformanceCounter (&time_now); LONGLONG offset = time_now.QuadPart - last_time.QuadPart; secs = (double) offset / (double) iCounterFrequency; // TRACE ("Secs = %10.4f\n", secs); } else { time_now.QuadPart = 0; time_now.QuadPart = 0; } // if no high-performance counter, just query the time each time if (iCounterFrequency == 0 || last_date.m_dt == 0 || secs > RESYNC_EVERY_SECS) { SYSTEMTIME systime; GetLocalTime (&systime); last_date = CmcDateTime(systime.wYear, systime.wMonth, systime.wDay, systime.wHour, systime.wMinute, (double) systime.wSecond + ( (double) systime.wMilliseconds / 1000.0) ); secs = 0; last_time = time_now; } CmcDateTime this_date (last_date); this_date.m_dt += secs / SECS_IN_DAY; // ---- debugging #if 0 { SYSTEMTIME systime; GetSystemTime (&systime); CmcDateTime test = CmcDateTime(systime.wYear, systime.wMonth, systime.wDay, systime.wHour, systime.wMinute, (double) systime.wSecond + ( (double) systime.wMilliseconds / 1000.0) ); double diff = test.m_dt - this_date.m_dt; TRACE1 ("Time difference = %10.8f\n", diff); } #endif // --- end debugging return this_date; }
VARIANT CMUSHclientDoc::GetTimerInfo(LPCTSTR TimerName, short InfoType) { CString strTimerName = TimerName; CTimer * timer_item; VARIANT vaResult; VariantInit(&vaResult); vaResult.vt = VT_NULL; // trim spaces from name, make lower-case CheckObjectName (strTimerName, false); vaResult.vt = VT_EMPTY; // see if timer exists, if not return EMPTY if (!GetTimerMap ().Lookup (strTimerName, timer_item)) return vaResult; switch (InfoType) { case 1: if (timer_item->iType == CTimer::eAtTime) SetUpVariantShort (vaResult, timer_item->iAtHour); else SetUpVariantShort (vaResult, timer_item->iEveryHour); break; case 2: if (timer_item->iType == CTimer::eAtTime) SetUpVariantShort (vaResult, timer_item->iAtMinute); else SetUpVariantShort (vaResult, timer_item->iEveryMinute); break; case 3: if (timer_item->iType == CTimer::eAtTime) SetUpVariantDouble (vaResult, timer_item->fAtSecond); else SetUpVariantDouble (vaResult, timer_item->fEverySecond); break; case 4: SetUpVariantString (vaResult, timer_item->strContents); break; case 5: SetUpVariantString (vaResult, timer_item->strProcedure); break; case 6: SetUpVariantBool (vaResult, timer_item->bEnabled); break; case 7: SetUpVariantBool (vaResult, timer_item->bOneShot); break; case 8: SetUpVariantBool (vaResult, timer_item->iType == CTimer::eAtTime); break; case 9: SetUpVariantLong (vaResult, timer_item->nInvocationCount); break; case 10: SetUpVariantLong (vaResult, timer_item->nMatched); break; case 11: if (timer_item->tWhenFired.GetTime ()) // only if non-zero, otherwise return empty SetUpVariantDate (vaResult, COleDateTime (timer_item->tWhenFired.GetTime ())); break; case 12: if (timer_item->tFireTime.GetTime ()) // only if non-zero, otherwise return empty SetUpVariantDate (vaResult, COleDateTime (timer_item->tFireTime.GetTime ())); break; case 13: { CmcDateTime tDue = CmcDateTime (timer_item->tFireTime.GetTime ()); CmcDateTime tNow = CmcDateTime::GetTimeNow (); if (tDue < tNow) SetUpVariantDouble (vaResult, 0); // due immediately else { CmcDateTimeSpan ts = tDue - tNow; SetUpVariantDouble (vaResult, ts.GetTotalSeconds ()); // how many seconds to go } } break; case 14: SetUpVariantBool (vaResult, timer_item->bTemporary); break; case 15: SetUpVariantBool (vaResult, timer_item->iSendTo == eSendToSpeedwalk); break; case 16: SetUpVariantBool (vaResult, timer_item->iSendTo == eSendToOutput); break; case 17: SetUpVariantBool (vaResult, timer_item->bActiveWhenClosed); break; case 18: SetUpVariantBool (vaResult, timer_item->bIncluded); break; case 19: SetUpVariantString (vaResult, timer_item->strGroup); break; case 20: SetUpVariantLong (vaResult, timer_item->iSendTo); break; case 21: SetUpVariantLong (vaResult, timer_item->iUserOption); break; case 22: SetUpVariantString (vaResult, timer_item->strLabel); break; case 23: SetUpVariantBool (vaResult, timer_item->bOmitFromOutput); break; case 24: SetUpVariantBool (vaResult, timer_item->bOmitFromLog); break; case 25: SetUpVariantBool (vaResult, timer_item->bExecutingScript); break; case 26: SetUpVariantBool (vaResult, timer_item->dispid != DISPID_UNKNOWN); break; default: vaResult.vt = VT_NULL; break; } // end of switch return vaResult; } // end of CMUSHclientDoc::GetTimerInfo