⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 timers.c

📁 MiniWinOuterSM MiniWinOuterSM
💻 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 + -