//#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消息始终属于最低优先级的消息,当线程的队列中没有其他消息时,才检索该消息。等待定时器的处理方法与其他内核对象没有什么差别,如果定时器发出报时信息,而你的线程正在等待之中,那么你的线程就会醒来。
*/