可等待的计时器内核对象


//#include <iostream.h>
//#using namespace std;
#include < Windows.h>
//#include <stdcal.h>
int main()
{
 SYSTEM_INFO info;
 GetSystemInfo(&info);


 //获取处理器详细信息
 //PSYSTEM_LOGICAL_PROCESSOR_INFOMATION pBuffer = NULL;
 //DWORD dwSize = 0;
 //GetLogicalProcessorInfomation(pBuffer,&dwSize);

 //虚拟内存状态
 //LPMEMORYSTATUS  lpBuffer;
 //ZeroMemory(&lpBuffer, sizeof(lpBuffer));
 //GlobalMemoryStatus(lpBuffer);

   MEMORYSTATUS stat;

  GlobalMemoryStatus (&stat);

  //确定地址空间
  //LPCVOID lpAddress;
  //PMEMORY_BASIC_INFORMATION lpBuffer;
  //SIZE_T dwLength = sizeof(PMEMORY_BASIC_INFORMATION);
  //int err = VirtualQuery(info., lpBuffer, dwLength);

  //可等待的计时器内核对象
  HANDLE hTimer;
  SYSTEMTIME st;
  FILETIME ftLocal,ftUTC;
  LARGE_INTEGER liUTC;
  // FILETIME 和 LARGE_INTEGER 具有完全相同的2进制格式,但是他们的
  // 对齐方式不同,FILETIME 对齐的地址必须是32位边界,而LARGE_INTEGER是64

  hTimer = CreateWaitableTimer(NULL, FALSE, NULL);//自动重置
  st.wYear = 1012;
  st.wMonth = 12;
  st.wDayOfWeek = 52;
  st.wDay = 1;
  st.wHour = 14;
  st.wMinute = 1;
  st.wSecond = 0;
  st.wMilliseconds = 0;

  SystemTimeToFileTime(&st,&ftLocal);
  LocalFileTimeToFileTime(&ftLocal, &ftUTC);

  liUTC.LowPart = ftUTC.dwLowDateTime;
  liUTC.HighPart = ftUTC.dwHighDateTime;

  SetWaitableTimer(hTimer, &liUTC,6*60*60*1000,NULL,NULL,FALSE);

  //可以把上次的定时器取消,并重新 重置  SetWaitableTimer(并不是需要在每次调用该函数之前一定要调用CancelWaitableTimer)
  //等待事件被触发
  WaitForSingleObject();
  WaitForMultipleObjects();

  //取消定时器关联的时间内核对象
  CancelWaitableTimer(hTimer);
 

  //关闭内核对象
  CloseHandle(hTimer);
 return 0;
}
/*
windows笔记-等待定时器与用户定时器的区别
等待定时器(SetWaitableTimer)与用户定时器(SetTimer)它们之间的最大差别是,用户定时器需要在应用程序中设置许多附加的用户界面结构,这使定时器变得资源更加密集。

等待定时器属于内核对象,这意味着它们可以供多个线程共享,并且是安全的。

 
用户定时器能够生成WM_TIMER消息,这些消息将返回给调用SetTimer(用于回调定时器)的线程和创建窗口(用于基于窗口的定时器)的线程。因此,当用户定时器报时的时候,只有一个线程得到通知。

 
多个线程可以在等待定时器上进行等待,如果定时器是个人工重置的定时器,则可以调度若干个线程。

如果要执行与用户界面相关的事件,以便对定时器作出响应,那么使用用户定时器来组织代码结构可能更加容易些,因为使用等待定时器时,线程必须既要等待各种消息,又要等待内核对象(如果要改变代码的结构,可以使用MsgaitForMultipleObjects函数)。

 
等待定时器,当到了规定时间的时候,更有可能得到通知。WM_TIMER消息始终属于最低优先级的消息,当线程的队列中没有其他消息时,才检索该消息。等待定时器的处理方法与其他内核对象没有什么差别,如果定时器发出报时信息,而你的线程正在等待之中,那么你的线程就会醒来。

*/

你可能感兴趣的:(可等待的计时器内核对象)