📄 timers.c
字号:
#include"osdwindows.h"
#include"prdbg.h"
typedef enum {
RUN_ONCE,
RUN_DAILY,
RUN_WEEKLY,
RUN_MONTHLY,
RUN_YEARLY
}RUNTYPE;
typedef struct{
RUNTYPE runType;
DWORD startTime;
DWORD Data;
}TIMERITEM;
#define SECONDSPERDAY (3600*24)
static DWORD GetNextStartTime(TIMERITEM*itm)
{
switch(itm->runType){
case RUN_ONCE:return FALSE;
case RUN_DAILY:
itm->startTime+=SECONDSPERDAY;
break;
case RUN_WEEKLY://
itm->startTime+=SECONDSPERDAY*7;
break;
default:return FALSE;
}
return TRUE;
}
BOOL AddTimer(RUNTYPE rtype,SYSTEMTIME*syst,DWORD lParam)
{
FILETIME t,tnow,nextTime;
SYSTEMTIME stnow;
GetLocalTime(&stnow);
SystemTimeToFileTime(&stnow,&tnow);
SystemTimeToFileTime(syst,&t);
nextTime.dwHighDateTime=tnow.dwHighDateTime;
switch(rtype){
case RUN_ONCE:
if(t.dwLowDateTime<tnow.dwLowDateTime)
return FALSE;
break;
case RUN_DAILY://每天运行的starttime(syst)只需要设置时间部分,不必设置日期
if((t.dwLowDateTime%SECONDSPERDAY)>(tnow.dwLowDateTime%SECONDSPERDAY)){
nextTime.dwLowDateTime=tnow.dwLowDateTime-(tnow.dwLowDateTime%SECONDSPERDAY)
+(t.dwLowDateTime%SECONDSPERDAY);
}else{
nextTime.dwLowDateTime=tnow.dwLowDateTime-(tnow.dwLowDateTime%SECONDSPERDAY)
+(t.dwLowDateTime%SECONDSPERDAY)+SECONDSPERDAY;
}
break;
case RUN_WEEKLY://每周运行的必须设置wDayOfWeek字段
if( (syst->wDayOfWeek!=stnow.wDayOfWeek)||
( (syst->wDayOfWeek==stnow.wDayOfWeek) &&
(t.dwLowDateTime%SECONDSPERDAY<tnow.dwLowDateTime%SECONDSPERDAY) )
){
SYSTEMTIME stmp;
nextTime.dwLowDateTime=tnow.dwLowDateTime-(tnow.dwLowDateTime%SECONDSPERDAY)
+(t.dwLowDateTime%SECONDSPERDAY);
do{
nextTime.dwLowDateTime+=SECONDSPERDAY;
FileTimeToSystemTime(&nextTime,&stmp);
}while(stmp.wDayOfWeek!=syst->wDayOfWeek);
}else{
nextTime.dwLowDateTime=tnow.dwLowDateTime-(tnow.dwLowDateTime%SECONDSPERDAY)
+(t.dwLowDateTime%SECONDSPERDAY);
}
break;
case RUN_MONTHLY:
return FALSE;
}
// nextTime added to Timer list
{
SYSTEMTIME tt;
FileTimeToSystemTime(&nextTime,&tt);
TRACE("RUNTYPE=%d NextRun Time=%04d/%02d/%02d %02d:%02d:%02d\r\n"
,rtype,tt.wYear,tt.wMonth,tt.wDay,tt.wHour,tt.wMinute,tt.wSecond);
}
return TRUE;
}
void TestTimer(void)
{
SYSTEMTIME tnow,tn1;
DWORD tt;
GetLocalTime(&tnow);
tnow.wHour--;
AddTimer(RUN_ONCE,&tnow,0);
AddTimer(RUN_DAILY,&tnow,0);
AddTimer(RUN_WEEKLY,&tnow,0);
GetLocalTime(&tn1);
tt=GetTickCount();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -