我开始是在对话框的初始化里加入SetTimer(1,2000,NULL) 然后用向导在对话框里建立了一个Ontimer函数,并在函数里写了一条执行指令(没做判断)。程序运行后就每隔2秒执行这条指令。
我想要做的是,实现多个定时器,并且在需要的时候调用,并在不需要的时候关掉。而且问一句,KillTimer()之后这个定时器还能不能再次调用?
请问怎么做
12 个解决方案
#1
KillTimer()之后这个定时器还能不能再次调用?
//可以,SetTimer()即可。多个定时器只要ID不同就可以。
//可以,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);
}
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
正解
#6
帮忙看看这个问题
http://topic.csdn.net/u/20091016/20/975c57e8-9922-4e5e-997c-ce15c150aec6.html
谢谢!
http://topic.csdn.net/u/20091016/20/975c57e8-9922-4e5e-997c-ce15c150aec6.html
谢谢!
#7
帮顶...
#8
danxuezx:
多个定时器的话ontimer怎么写?
多个定时器的话ontimer怎么写?
#9
ONTIMER以SETTIMER的计时器标志为依据来响应,如果设置为1,则响应标志为1的计时器的消息。
借地问下:一个窗口SETTIMER,其他窗口能否直接响应(即不通过SENDMESSAGE、POSTMESSAGE)?
借地问下:一个窗口SETTIMER,其他窗口能否直接响应(即不通过SENDMESSAGE、POSTMESSAGE)?
#10
在OnTimer中可以获得所有定时器到时的消息,需要在OnTimer中判断当前到时的ID和每个定时器的ID是否相同来做相应的处理,也就是上面代码中的Switch的作用
#12
上面的那个程序运行时报错,内存错误。怎么回事,
就是这段:
case 1: // 定时器
{
// 变量声明必须在“{}”中
COleDateTime dtCurrent; //用于获取系统时间
dtCurrent = COleDateTime::GetCurrentTime(); //获取系统当前时间
CString strDT = dtCurrent.Format("%Y-%m-%d %H:%M:%S"); //格式化时间
UpdateData();
m_text1=strDT; // 文本框
UpdateData(false);
}
就是这段:
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不同就可以。
//可以,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);
}
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
正解
#6
帮忙看看这个问题
http://topic.csdn.net/u/20091016/20/975c57e8-9922-4e5e-997c-ce15c150aec6.html
谢谢!
http://topic.csdn.net/u/20091016/20/975c57e8-9922-4e5e-997c-ce15c150aec6.html
谢谢!
#7
帮顶...
#8
danxuezx:
多个定时器的话ontimer怎么写?
多个定时器的话ontimer怎么写?
#9
ONTIMER以SETTIMER的计时器标志为依据来响应,如果设置为1,则响应标志为1的计时器的消息。
借地问下:一个窗口SETTIMER,其他窗口能否直接响应(即不通过SENDMESSAGE、POSTMESSAGE)?
借地问下:一个窗口SETTIMER,其他窗口能否直接响应(即不通过SENDMESSAGE、POSTMESSAGE)?
#10
在OnTimer中可以获得所有定时器到时的消息,需要在OnTimer中判断当前到时的ID和每个定时器的ID是否相同来做相应的处理,也就是上面代码中的Switch的作用
#11
给LZ推荐一个VC的定时器使用,有源码和大量注释,LZ一定要试下:
http://download.csdn.net/detail/txzsp/2285350
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);
}
就是这段:
case 1: // 定时器
{
// 变量声明必须在“{}”中
COleDateTime dtCurrent; //用于获取系统时间
dtCurrent = COleDateTime::GetCurrentTime(); //获取系统当前时间
CString strDT = dtCurrent.Format("%Y-%m-%d %H:%M:%S"); //格式化时间
UpdateData();
m_text1=strDT; // 文本框
UpdateData(false);
}