我的本意是要程序在每天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);
}

解决方案 »

  1.   

    DWORD WINAPI gThreadProc(LONG lParam)
    {
       HANDLE hTimer = (HANDLE)lParam;
       WaitForSingleObject( hTimer,......
       return 0;
    }把htimer当线程的参数传递,这样试试。
      

  2.   

    我搞定了,SetWaitableTimer和TimerAPCProc要在同一个线程里。代码如下:VOID CALLBACK TimerAPCProc( LPVOID lpArg,              // Data value 
       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);
    }