VC定时器的用法,SetTimer和Ontimer的用法。

时间:2022-08-04 23:29:39
我是VC初学者,没用过定时器。请问一下SetTimer和Ontimer的用法。
我开始是在对话框的初始化里加入SetTimer(1,2000,NULL) 然后用向导在对话框里建立了一个Ontimer函数,并在函数里写了一条执行指令(没做判断)。程序运行后就每隔2秒执行这条指令。
我想要做的是,实现多个定时器,并且在需要的时候调用,并在不需要的时候关掉。而且问一句,KillTimer()之后这个定时器还能不能再次调用?
请问怎么做

12 个解决方案

#1


KillTimer()之后这个定时器还能不能再次调用? 
//可以,SetTimer()即可。多个定时器只要ID不同就可以。

#2


UINT_PTR SetTimer(          
    HWND hWnd,//和定时器相关联的窗口
    UINT_PTR nIDEvent,//一个非0的数字标志这个定时器
    UINT uElapse,//指定时间间隔,以毫秒为单位
    TIMERPROC lpTimerFunc//一般指定为null
);
当在MFC的工程中如下:
UINT_PTR SetTimer(          
    UINT_PTR nIDEvent,//一个非0的数字标志这个定时器
    UINT uElapse,//指定时间间隔,以毫秒为单位
    TIMERPROC lpTimerFunc//一般指定为null
);
用法如下:

SetTimer(1,1000,NULL);//设置了一个1s的定时器1.
然后在每次时间到1s时会触发WM_TIMER消息,其消息响应函数如下:
void CXXX::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
        // 此处加入如下代码就好了:
         switch()
        {
         case 1:
              //做该做的事情
                //当不需要的时候在此处调用KillTimer(1);
              break;
         default:
              break;
        }
CDialog::OnTimer(nIDEvent);
}

#3


同意楼上

#4


在上面的回复中代码中的switch中少了变量,应为:switch(nIDEvent) 

#5


引用 2 楼 danxuezx 的回复:
UINT_PTR SetTimer(         
    HWND hWnd,//和定时器相关联的窗口
    UINT_PTR nIDEvent,//一个非0的数字标志这个定时器
    UINT uElapse,//指定时间间隔,以毫秒为单位
    TIMERPROC lpTimerFunc//一般指定为null
);
当在MFC的工程中如下:
UINT_PTR SetTimer(         
    UINT_PTR nIDEvent,//一个非0的数字标志这个定时器
    UINT uElapse,//指定时间间隔,以毫秒为单位
    TIMERPROC lpTimerFunc//一般指定为null
);
用法如下:

SetTimer(1,1000,NULL);//设置了一个1s的定时器1.
然后在每次时间到1s时会触发WM_TIMER消息,其消息响应函数如下:
void CXXX::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
        // 此处加入如下代码就好了:
        switch()
        {
        case 1:
              //做该做的事情
                //当不需要的时候在此处调用KillTimer(1);
              break;
        default:
              break;
        }
CDialog::OnTimer(nIDEvent);
}



正解

#6


帮忙看看这个问题 
http://topic.csdn.net/u/20091016/20/975c57e8-9922-4e5e-997c-ce15c150aec6.html
谢谢!

#7


帮顶...

#8


danxuezx:
多个定时器的话ontimer怎么写?

#9


ONTIMER以SETTIMER的计时器标志为依据来响应,如果设置为1,则响应标志为1的计时器的消息。
借地问下:一个窗口SETTIMER,其他窗口能否直接响应(即不通过SENDMESSAGE、POSTMESSAGE)?

#10


引用 8 楼 xuntaohm 的回复:
danxuezx:
多个定时器的话ontimer怎么写?


在OnTimer中可以获得所有定时器到时的消息,需要在OnTimer中判断当前到时的ID和每个定时器的ID是否相同来做相应的处理,也就是上面代码中的Switch的作用

#11


给LZ推荐一个VC的定时器使用,有源码和大量注释,LZ一定要试下:
http://download.csdn.net/detail/txzsp/2285350

#12


上面的那个程序运行时报错,内存错误。怎么回事,
就是这段:

case 1:  // 定时器
            {
            // 变量声明必须在“{}”中
                COleDateTime dtCurrent; //用于获取系统时间 
                dtCurrent = COleDateTime::GetCurrentTime(); //获取系统当前时间 

                CString strDT = dtCurrent.Format("%Y-%m-%d %H:%M:%S"); //格式化时间 
   
                UpdateData();
                  m_text1=strDT;   // 文本框
                UpdateData(false);
            }

#1


KillTimer()之后这个定时器还能不能再次调用? 
//可以,SetTimer()即可。多个定时器只要ID不同就可以。

#2


UINT_PTR SetTimer(          
    HWND hWnd,//和定时器相关联的窗口
    UINT_PTR nIDEvent,//一个非0的数字标志这个定时器
    UINT uElapse,//指定时间间隔,以毫秒为单位
    TIMERPROC lpTimerFunc//一般指定为null
);
当在MFC的工程中如下:
UINT_PTR SetTimer(          
    UINT_PTR nIDEvent,//一个非0的数字标志这个定时器
    UINT uElapse,//指定时间间隔,以毫秒为单位
    TIMERPROC lpTimerFunc//一般指定为null
);
用法如下:

SetTimer(1,1000,NULL);//设置了一个1s的定时器1.
然后在每次时间到1s时会触发WM_TIMER消息,其消息响应函数如下:
void CXXX::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
        // 此处加入如下代码就好了:
         switch()
        {
         case 1:
              //做该做的事情
                //当不需要的时候在此处调用KillTimer(1);
              break;
         default:
              break;
        }
CDialog::OnTimer(nIDEvent);
}

#3


同意楼上

#4


在上面的回复中代码中的switch中少了变量,应为:switch(nIDEvent) 

#5


引用 2 楼 danxuezx 的回复:
UINT_PTR SetTimer(         
    HWND hWnd,//和定时器相关联的窗口
    UINT_PTR nIDEvent,//一个非0的数字标志这个定时器
    UINT uElapse,//指定时间间隔,以毫秒为单位
    TIMERPROC lpTimerFunc//一般指定为null
);
当在MFC的工程中如下:
UINT_PTR SetTimer(         
    UINT_PTR nIDEvent,//一个非0的数字标志这个定时器
    UINT uElapse,//指定时间间隔,以毫秒为单位
    TIMERPROC lpTimerFunc//一般指定为null
);
用法如下:

SetTimer(1,1000,NULL);//设置了一个1s的定时器1.
然后在每次时间到1s时会触发WM_TIMER消息,其消息响应函数如下:
void CXXX::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
        // 此处加入如下代码就好了:
        switch()
        {
        case 1:
              //做该做的事情
                //当不需要的时候在此处调用KillTimer(1);
              break;
        default:
              break;
        }
CDialog::OnTimer(nIDEvent);
}



正解

#6


帮忙看看这个问题 
http://topic.csdn.net/u/20091016/20/975c57e8-9922-4e5e-997c-ce15c150aec6.html
谢谢!

#7


帮顶...

#8


danxuezx:
多个定时器的话ontimer怎么写?

#9


ONTIMER以SETTIMER的计时器标志为依据来响应,如果设置为1,则响应标志为1的计时器的消息。
借地问下:一个窗口SETTIMER,其他窗口能否直接响应(即不通过SENDMESSAGE、POSTMESSAGE)?

#10


引用 8 楼 xuntaohm 的回复:
danxuezx:
多个定时器的话ontimer怎么写?


在OnTimer中可以获得所有定时器到时的消息,需要在OnTimer中判断当前到时的ID和每个定时器的ID是否相同来做相应的处理,也就是上面代码中的Switch的作用

#11


给LZ推荐一个VC的定时器使用,有源码和大量注释,LZ一定要试下:
http://download.csdn.net/detail/txzsp/2285350

#12


上面的那个程序运行时报错,内存错误。怎么回事,
就是这段:

case 1:  // 定时器
            {
            // 变量声明必须在“{}”中
                COleDateTime dtCurrent; //用于获取系统时间 
                dtCurrent = COleDateTime::GetCurrentTime(); //获取系统当前时间 

                CString strDT = dtCurrent.Format("%Y-%m-%d %H:%M:%S"); //格式化时间 
   
                UpdateData();
                  m_text1=strDT;   // 文本框
                UpdateData(false);
            }