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

📄 wintimer.c

📁 MinGUI 可视化程序代码
💻 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 + -