📄 wintimer.c
字号:
/******************************************************************************** Copyright 2006 National ASIC Center, All right Reserved** FILE NAME: wintimer.c* PROGRAMMER: ming.c* Date of Creation: 2006/08/8** DESCRIPTION:** NOTE:** FUNCTIONS LIST:* -----------------------------------------------------------------------------** -----------------------------------------------------------------------------** MODIFICATION HISTORY* LastModify 2006/09/27******************************************************************************/#include "mingui.h"//---------------------------------------------------------------------------int GUI_Protect=0;TGUITimer *GUI_Timers=NULL;TWndDateTime g_SysTime=0,g_RefTime=0;//---------------------------------------------------------------------------typedef void (*TVoidProc)(void);//////////////////////////////////////////////////////////////////////////////////////////////long GetDayCount(int year,int month,int day);///////////////////////////////////////////////////////////////////////////////////////////////*---------------------------------------------------------------------------FUNCTION CreateTimerDESCRIPTION 创建循环消息定时器,计时溢出时将发送指定消息给指定窗口INPUTS RecvHnd 接收消息的窗口 initial_time 定时器倒计时初载值 (单位豪秒) reschedule_time 定时器倒计时重载值 (单位豪秒) TimerProc 计时溢出时调用的函数,若为NULL,则向目标窗体发送WM_TIMER消息 Enabled 定时器创建时是否使能OUTPUT 返回创建的定时器ID,如果创建失败返回NULL---------------------------------------------------------------------------*/HANDLE CreateTimer(HWND hWnd,DWORD initial_time,DWORD reschedule_time,void(*TimerProc)(HWND),BOOL Enabled){ TGUITimer *node=NULL; GUI_Protect++; node=(TGUITimer *)GetMem(sizeof(TGUITimer));
node->Mark=GUI_MARK_TMR; node->RecvWnd=hWnd; node->TimerProc=TimerProc; node->InitialTime=initial_time; node->RescheduleTime=reschedule_time; node->Enabled=false; if(Enabled)EnableTimer((HANDLE)node,true); GUI_Protect--; return (HANDLE)node;
}/*---------------------------------------------------------------------------FUNCTION EnableTimerDESCRIPTION 定时器使能开关控制---------------------------------------------------------------------------*/void EnableTimer(HANDLE hTimer,BOOL Enabled){ TGUITimer *TmrNode=(TGUITimer *)hTimer; GUI_Protect++; if(IsTmr(hTimer) && TmrNode->Enabled!=Enabled) { if(Enabled && (TmrNode->InitialTime || TmrNode->RescheduleTime)) { TmrNode->Enabled=true; TmrNode->DueTime=g_SysTime+TmrNode->InitialTime; if(!GUI_Timers) { TmrNode->Next=TmrNode; TmrNode->Prev=TmrNode; GUI_Timers=TmrNode; } else { TWndDateTime InitDueTime=TmrNode->DueTime; if(InitDueTime<=GUI_Timers->DueTime) { NODE_PREV_INSERT(TmrNode,GUI_Timers); GUI_Timers=TmrNode; } else { TGUITimer *node=GUI_Timers; do { if(node->DueTime > InitDueTime)break; else node=node->Next; }while(node!=GUI_Timers); NODE_PREV_INSERT(TmrNode,node); } } } else if(!Enabled) { TmrNode->Enabled=false; if(TmrNode!=GUI_Timers) { NODE_REMOVE(TmrNode); } else { if(TmrNode==TmrNode->Next) { GUI_Timers=NULL; } else { GUI_Timers=GUI_Timers->Next; NODE_REMOVE(TmrNode); } } } } GUI_Protect--;
}/*---------------------------------------------------------------------------FUNCTION ResetTimerDESCRIPTION 消息定时器参数重设定---------------------------------------------------------------------------*/void ResetTimer(HANDLE hTimer,HWND hWnd,DWORD initial_time,DWORD reschedule_time,void(*TimerProc)(HWND),BOOL Enabled){ GUI_Protect++; if(IsTmr(hTimer)) { TGUITimer *TmrNode=(TGUITimer *)hTimer; if(TmrNode->Enabled)EnableTimer(hTimer,false); TmrNode->RecvWnd=hWnd;
TmrNode->TimerProc=TimerProc; TmrNode->InitialTime=initial_time; TmrNode->RescheduleTime=reschedule_time; if(Enabled)EnableTimer(hTimer,true); } GUI_Protect--;}/*---------------------------------------------------------------------------FUNCTION DestroyTimerDESCRIPTION 销毁定时器。---------------------------------------------------------------------------*/void DestroyTimer(HANDLE hTimer){ GUI_Protect++; if(IsTmr(hTimer)) { if(((TGUITimer *)hTimer)->Enabled) { EnableTimer(hTimer,false); }
((TGUITimer *)hTimer)->Mark=0; FreeMem((TGUITimer *)hTimer); } GUI_Protect--;} /*---------------------------------------------------------------------------FUNCTION SetSysDateTimeDESCRIPTION 设置系统时间. 系统支持的最小时间为 1900年1月1日 0时0分0秒---------------------------------------------------------------------------*/void SetSysDateTime(int year,int month,int day,int hour,int minute,int second){ TWndDateTime DateCount=GetDayCount(year,month,day); g_RefTime=DateCount*24*60*60*1000+hour*60*60*1000+minute*60*1000+ second*1000-g_SysTime;}/*---------------------------------------------------------------------------FUNCTION GetSysDateDESCRIPTION 读取系统日期 :年-月-日---------------------------------------------------------------------------*/#define IsLeapYear(Year) ( ((Year)%4==0 && (Year)%100!=0 ) || (Year)%400==0 )void GetSysDate(int *Year, int *Month,int *Day){ const DWORD monthDay[]={31,28,31,30,31,30,31,31,30,31,30,31}; TWndDateTime nowtime=g_RefTime+g_SysTime; DWORD daycount= (DWORD)(nowtime/(24*60*60*1000)); DWORD YearDayCount,initYear=1900,initMonth=1,initDay=1; while(1) { YearDayCount=(IsLeapYear(initYear))?366:365; if(daycount>=YearDayCount) { initYear++; daycount-=YearDayCount; }else break; } while(1) { if(daycount>=monthDay[initMonth-1]) { daycount-=monthDay[initMonth-1]; initMonth++; }else break; } initDay=daycount+initDay; *Year=initYear; *Month=initMonth; *Day=initDay;}/*---------------------------------------------------------------------------FUNCTION GetSysTimeDESCRIPTION 读取系统时间 : 时-分-秒---------------------------------------------------------------------------*/void GetSysTime(int *Hour, int *Minute,int *Second){ TWndDateTime nowtime=g_RefTime+g_SysTime; nowtime=nowtime/1000; *Second=(int)(nowtime % 60); nowtime=nowtime/60; *Minute=(int)(nowtime % 60); nowtime=nowtime/60; *Hour=(int)(nowtime % 24);}/*---------------------------------------------------------------------------FUNCTION GetWeekDayDESCRIPTION 根据年月日获取星期几---------------------------------------------------------------------------*/int GetWeekDay(int year,int month,int day){ const BYTE initWeekDay=1; // 1900年1月1日是星期二 (星期一至七用0~6表示) long DayCount=GetDayCount(year,month,day); return (DayCount %7)+initWeekDay;}/*---------------------------------------------------------------------------FUNCTION GetDayCountDESCRIPTION 根据年月日获取距离1900年1月1日的天数---------------------------------------------------------------------------*/long GetDayCount(int year,int month,int day){ const int initYear=1900,initMonth=1,initDay=1; // 其始日期为1900年1月1日 const int monthDay[]={31,28,31,30,31,30,31,31,30,31,30,31}; int i; int dayCount=0;//7天为一个for循环周期 if(year>=initYear) { year=year-initYear; while(year!=0) { dayCount +=365; if(IsLeapYear(initYear+year))dayCount+=1;//qf:判断如果是闰年的话,加1 year--; } month =month-initMonth; for(i=0;i<month;i++) dayCount+=monthDay[i]; dayCount=dayCount+day-initDay; return dayCount; } return 0;}/*---------------------------------------------------------------------------FUNCTION WndTimerPulseDESCRIPTION GUI时钟驱动函数。---------------------------------------------------------------------------*/void GUI_TimerPulse(void){ g_SysTime += GUI_CLK_CYCLE;
while(GUI_Timers && g_SysTime>=GUI_Timers->DueTime && !GUI_Protect) { TGUITimer *DueNode=GUI_Timers;
TGUITimer *nextnode=DueNode->Next; TWndDateTime RescheduleDueTime;
if(DueNode->RescheduleTime) { DueNode->DueTime+=DueNode->RescheduleTime; RescheduleDueTime=DueNode->DueTime; if(DueNode!=nextnode && RescheduleDueTime>nextnode->DueTime) { GUI_Timers=nextnode;
if(RescheduleDueTime<DueNode->Prev->DueTime) { NODE_REMOVE(DueNode); do nextnode=nextnode->Next; while (nextnode->DueTime<RescheduleDueTime); NODE_PREV_INSERT(DueNode,nextnode); } } } else { DueNode->Enabled=false; if(DueNode!=nextnode) { NODE_REMOVE(DueNode); GUI_Timers=nextnode; } else { GUI_Timers=NULL; } }
if(DueNode->RecvWnd)
{ if(IsWnd(DueNode->RecvWnd))
{ PostMessage(DueNode->RecvWnd,WM_TIMER,(WPARAM)DueNode,0);
}
else
{ DestroyTimer((HANDLE)DueNode);
}
}
else if(DueNode->TimerProc)
{ DueNode->TimerProc(NULL);
}
}}/*---------------------------------------------------------------------------END --- Thank you! ming.c---------------------------------------------------------------------------*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -