我的本意是要程序在每天0点,执行一个函数,每天一次,这里做实验,就每15秒一次,代码如下:HANDLE hTimer; //等待定时器句柄
SYSTEMTIME st; //SYSTEMTIME结构,用来设置第1次通知的时间
FILETIME ftLocal, ftUTC; //FILETIME结构,用来接受STSTEMTIME结构的转换
LARGE_INTEGER liUTC; //LARGE_INTEGER结构,作为SetWaitableTimer的参数VOID CALLBACK TimerAPCProc( LPVOID lpArg, // Data value
DWORD dwTimerLowValue, // Timer low value
DWORD dwTimerHighValue)
{
AfxMessageBox("ok");
}void CTimertestDlg::OnOK()
{
// TODO: Add extra validation here
// 创建一个匿名的默认安全性的人工重置的等待定时器内核对象,并保存句柄
hTimer = CreateWaitableTimer(NULL, TRUE, NULL);
//设置第一次通知时间
st.wYear = 2010; // 年
st.wMonth = 6; // 月
st.wDayOfWeek = 0; // 一周中的某个星期
st.wDay = 22; // 日
st.wHour = 13; // 小时(下午8点)
st.wMinute = 52; // 分
st.wSecond = 0; // 秒
st.wMilliseconds = 0; // 毫秒
//将SYSTIME结构转换为FILETIME结构
SystemTimeToFileTime(&st, &ftLocal);
//将本地时间转换为标准时间(UTC),SetWaitableTimer函数接受一个标准时间
LocalFileTimeToFileTime(&ftLocal, &ftUTC);
// 设置LARGE_INTEGER结构,因为该结构数据要作为SetWaitableTimer的参数
liUTC.LowPart = ftUTC.dwLowDateTime;
liUTC.HighPart = ftUTC.dwHighDateTime;
// 设置等待定时器内核对象(一天的毫秒数为24*60*60*1000)
SetWaitableTimer(hTimer, &liUTC, /*24 * 60 * 60*/15 * 1000,TimerAPCProc, NULL, FALSE);
while(1)
SleepEx(INFINITE, TRUE);
}这样做是成功的,我想将最后的语句: while(1) SleepEx(INFINITE, TRUE);做在另外一个线程里,线程是启动了,但是定时器却不行了,请教下是什么原因,谢谢!修改的代码如下:HANDLE hTimer; //等待定时器句柄
SYSTEMTIME st; //SYSTEMTIME结构,用来设置第1次通知的时间
FILETIME ftLocal, ftUTC; //FILETIME结构,用来接受STSTEMTIME结构的转换
LARGE_INTEGER liUTC; //LARGE_INTEGER结构,作为SetWaitableTimer的参数VOID CALLBACK TimerAPCProc( LPVOID lpArg, // Data value
DWORD dwTimerLowValue, // Timer low value
DWORD dwTimerHighValue)
{
AfxMessageBox("ok");
}DWORD WINAPI gThreadProc(LONG lParam)
{
while(1)
SleepEx(INFINITE, TRUE); return 0;
}
void CTimertestDlg::OnOK()
{
// TODO: Add extra validation here
// 创建一个匿名的默认安全性的人工重置的等待定时器内核对象,并保存句柄
hTimer = CreateWaitableTimer(NULL, TRUE, NULL);
//设置第一次通知时间
st.wYear = 2010; // 年
st.wMonth = 6; // 月
st.wDayOfWeek = 0; // 一周中的某个星期
st.wDay = 22; // 日
st.wHour = 13; // 小时(下午8点)
st.wMinute = 52; // 分
st.wSecond = 0; // 秒
st.wMilliseconds = 0; // 毫秒
//将SYSTIME结构转换为FILETIME结构
SystemTimeToFileTime(&st, &ftLocal);
//将本地时间转换为标准时间(UTC),SetWaitableTimer函数接受一个标准时间
LocalFileTimeToFileTime(&ftLocal, &ftUTC);
// 设置LARGE_INTEGER结构,因为该结构数据要作为SetWaitableTimer的参数
liUTC.LowPart = ftUTC.dwLowDateTime;
liUTC.HighPart = ftUTC.dwHighDateTime;
// 设置等待定时器内核对象(一天的毫秒数为24*60*60*1000)
SetWaitableTimer(hTimer, &liUTC, /*24 * 60 * 60*/15 * 1000,TimerAPCProc, NULL, FALSE);
/*while(1)
SleepEx(INFINITE, TRUE);*/
//创建等待信号的线程
DWORD gdwThreadId;
HANDLE hThrd;
hThrd=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)gThreadProc,NULL,0,&gdwThreadId);
}
SYSTEMTIME st; //SYSTEMTIME结构,用来设置第1次通知的时间
FILETIME ftLocal, ftUTC; //FILETIME结构,用来接受STSTEMTIME结构的转换
LARGE_INTEGER liUTC; //LARGE_INTEGER结构,作为SetWaitableTimer的参数VOID CALLBACK TimerAPCProc( LPVOID lpArg, // Data value
DWORD dwTimerLowValue, // Timer low value
DWORD dwTimerHighValue)
{
AfxMessageBox("ok");
}void CTimertestDlg::OnOK()
{
// TODO: Add extra validation here
// 创建一个匿名的默认安全性的人工重置的等待定时器内核对象,并保存句柄
hTimer = CreateWaitableTimer(NULL, TRUE, NULL);
//设置第一次通知时间
st.wYear = 2010; // 年
st.wMonth = 6; // 月
st.wDayOfWeek = 0; // 一周中的某个星期
st.wDay = 22; // 日
st.wHour = 13; // 小时(下午8点)
st.wMinute = 52; // 分
st.wSecond = 0; // 秒
st.wMilliseconds = 0; // 毫秒
//将SYSTIME结构转换为FILETIME结构
SystemTimeToFileTime(&st, &ftLocal);
//将本地时间转换为标准时间(UTC),SetWaitableTimer函数接受一个标准时间
LocalFileTimeToFileTime(&ftLocal, &ftUTC);
// 设置LARGE_INTEGER结构,因为该结构数据要作为SetWaitableTimer的参数
liUTC.LowPart = ftUTC.dwLowDateTime;
liUTC.HighPart = ftUTC.dwHighDateTime;
// 设置等待定时器内核对象(一天的毫秒数为24*60*60*1000)
SetWaitableTimer(hTimer, &liUTC, /*24 * 60 * 60*/15 * 1000,TimerAPCProc, NULL, FALSE);
while(1)
SleepEx(INFINITE, TRUE);
}这样做是成功的,我想将最后的语句: while(1) SleepEx(INFINITE, TRUE);做在另外一个线程里,线程是启动了,但是定时器却不行了,请教下是什么原因,谢谢!修改的代码如下:HANDLE hTimer; //等待定时器句柄
SYSTEMTIME st; //SYSTEMTIME结构,用来设置第1次通知的时间
FILETIME ftLocal, ftUTC; //FILETIME结构,用来接受STSTEMTIME结构的转换
LARGE_INTEGER liUTC; //LARGE_INTEGER结构,作为SetWaitableTimer的参数VOID CALLBACK TimerAPCProc( LPVOID lpArg, // Data value
DWORD dwTimerLowValue, // Timer low value
DWORD dwTimerHighValue)
{
AfxMessageBox("ok");
}DWORD WINAPI gThreadProc(LONG lParam)
{
while(1)
SleepEx(INFINITE, TRUE); return 0;
}
void CTimertestDlg::OnOK()
{
// TODO: Add extra validation here
// 创建一个匿名的默认安全性的人工重置的等待定时器内核对象,并保存句柄
hTimer = CreateWaitableTimer(NULL, TRUE, NULL);
//设置第一次通知时间
st.wYear = 2010; // 年
st.wMonth = 6; // 月
st.wDayOfWeek = 0; // 一周中的某个星期
st.wDay = 22; // 日
st.wHour = 13; // 小时(下午8点)
st.wMinute = 52; // 分
st.wSecond = 0; // 秒
st.wMilliseconds = 0; // 毫秒
//将SYSTIME结构转换为FILETIME结构
SystemTimeToFileTime(&st, &ftLocal);
//将本地时间转换为标准时间(UTC),SetWaitableTimer函数接受一个标准时间
LocalFileTimeToFileTime(&ftLocal, &ftUTC);
// 设置LARGE_INTEGER结构,因为该结构数据要作为SetWaitableTimer的参数
liUTC.LowPart = ftUTC.dwLowDateTime;
liUTC.HighPart = ftUTC.dwHighDateTime;
// 设置等待定时器内核对象(一天的毫秒数为24*60*60*1000)
SetWaitableTimer(hTimer, &liUTC, /*24 * 60 * 60*/15 * 1000,TimerAPCProc, NULL, FALSE);
/*while(1)
SleepEx(INFINITE, TRUE);*/
//创建等待信号的线程
DWORD gdwThreadId;
HANDLE hThrd;
hThrd=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)gThreadProc,NULL,0,&gdwThreadId);
}
{
HANDLE hTimer = (HANDLE)lParam;
WaitForSingleObject( hTimer,......
return 0;
}把htimer当线程的参数传递,这样试试。
DWORD dwTimerLowValue, // Timer low value
DWORD dwTimerHighValue)
{
AfxMessageBox("ok");
}DWORD WINAPI gThreadProc(LONG lParam)
{
HANDLE hTimer; //等待定时器句柄
SYSTEMTIME st; //SYSTEMTIME结构,用来设置第1次通知的时间
FILETIME ftLocal, ftUTC; //FILETIME结构,用来接受STSTEMTIME结构的转换
LARGE_INTEGER liUTC; //LARGE_INTEGER结构,作为SetWaitableTimer的参数
// 创建一个匿名的默认安全性的人工重置的等待定时器内核对象,并保存句柄
hTimer = CreateWaitableTimer(NULL, TRUE, NULL);
//设置第一次通知时间
st.wYear = 2010; // 年
st.wMonth = 6; // 月
st.wDayOfWeek = 0; // 一周中的某个星期
st.wDay = 22; // 日
st.wHour = 13; // 小时(下午8点)
st.wMinute = 52; // 分
st.wSecond = 0; // 秒
st.wMilliseconds = 0; // 毫秒
//将SYSTIME结构转换为FILETIME结构
SystemTimeToFileTime(&st, &ftLocal);
//将本地时间转换为标准时间(UTC),SetWaitableTimer函数接受一个标准时间
LocalFileTimeToFileTime(&ftLocal, &ftUTC);
// 设置LARGE_INTEGER结构,因为该结构数据要作为SetWaitableTimer的参数
liUTC.LowPart = ftUTC.dwLowDateTime;
liUTC.HighPart = ftUTC.dwHighDateTime;
// 设置等待定时器内核对象(一天的毫秒数为24*60*60*1000)
SetWaitableTimer(hTimer, &liUTC, /*24 * 60 * 60*/15 * 1000,TimerAPCProc, NULL, FALSE);
while(1)
SleepEx(INFINITE, TRUE); CloseHandle(hTimer);
return 0;
}void CTimertestDlg::OnOK()
{
// TODO: Add extra validation here //创建等待信号的线程
DWORD gdwThreadId;
HANDLE hThrd;
hThrd=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)gThreadProc,NULL,0,&gdwThreadId);
CloseHandle(hThrd);
}