求助:定时执行问题
刚学VC++,想实现一个定时执行的功能可老是不成功。功能是按下按钮后每两小时执行一次。void CClientdemoDlg::OnBnClickedButton11()
{
// TODO:
CTime t=CTime::GetCurrentTime();
int h=t.GetHour();
int MM=t.GetMinute();
int s=t.GetSecond();
if ( h%2==0&&MM==0&&s==0)
{
g_bCap = TRUE;
}
else
{
g_bCap = FALSE;
}
}问题好像是出在不能实时获取时间来判断。到了10点,12点也不执行,非得要按下按钮才执行。怪了。如何改,谢谢 --------------------编程问答-------------------- 使用 SetTimer, 然后处理 WM_TIMER 消息 --------------------编程问答-------------------- 去网上搜下SetTimer的用法吧,这个应该可以搞定 --------------------编程问答-------------------- GetCurrentTime(); 为何不行呢。怪了。
set timer()
因为程序里用的太多了,我都搞胡了。如果用GETTIME如何保证能实时取到系统时间呢?要刷新吗? --------------------编程问答--------------------
当然不会执行了,这是是按扭时间才触发.这里设置了是没有用处的.非得用SetTimer不可.GETTIME可以取到系统时间啊,怎么了?
不知道你要实现个什么功能?讲清楚些,你想实现什么样的效果? --------------------编程问答--------------------
CTime t=CTime::GetCurrentTime();
这个只有按了按钮才会取一次当前时间,而你不点击,就不会获取当前时间,自然就不可能得到时间用了多久,而Timer会有一个后台的消息循环等一直在跑,从而可以得到定时的间隔到了 --------------------编程问答-------------------- 谢谢楼上的几位,再看看我的代码如何更改:程序里已经用到了几个TIMER
void CClientdemoDlg::OnTimer(UINT nIDEvent)
{ if (nIDEvent == 1)
{ g_bCapPic = TRUE;
}
else if (nIDEvent == 10)
{if (nn1>=0)
{
m_frameshow.Format("nowframenum:%ld",MP4_ClientGetFrameNum(nn1));
UpdateData(FALSE);
}
}
CDialog::OnTimer(nIDEvent);
}
//按钮事件
void CClientdemoDlg::OnBnClickedButton11()
{
SetTimer(1,360000,NULL);//每小时 360×1000
}
这样可行吗? --------------------编程问答-------------------- 如果我再定义一个呢:
void __stdcall OnMyTimer(HWND hwnd,UINT m,UINT n,DWORD dr)
{
//回调功能咱写啊。g_bCapPic = TRUE; 不行的吧。
}
void CClientdemoDlg::OnBnClickedButton11()
{
SetTimer(1,3600000,OnMyTimer);
} --------------------编程问答-------------------- 都被你搞昏了,不知道你要干嘛,我说下,看对你有没有帮助.我设60*600ms干某一件事情,x是一个全局变量
在OnTimer的重载中这么写:
void CClientdemoDlg::OnTimer()
{
if(x==60)
{
do something
x=0;
}
else
x=x+1;
}
void CClientdemoDlg::OnBnClickedButton11()
{
SetTimer(1,600,OnMyTimer);
}
定时器600ms唤醒一次,每次去检查x的值 --------------------编程问答-------------------- 用 SetTimer,OnTimer --------------------编程问答-------------------- 8楼兄弟做法我认为很好。还是解决不了我的问题。
if(x==60)
{
do something
x=0;
}
else
x=x+1;
但是我的程序里已经用了一个TIMER了。见:
void CClientdemoDlg::OnTimer(UINT nIDEvent)
{ if (nIDEvent == 1)
{ g_bCapPic = TRUE; //我想做的就是这一个,每一个小时这个为TRUE 因此我不知道这样写是不是对的
}
else if (nIDEvent == 10)
{if (nn1>=0)
{
m_frameshow.Format("nowframenum:%ld",MP4_ClientGetFrameNum(nn1));
UpdateData(FALSE);
}
}
CDialog::OnTimer(nIDEvent);
}
//按钮事件
void CClientdemoDlg::OnBnClickedButton11()
{
SetTimer(1,3600000,NULL);//每小时 3600×1000
}
问题就是在我的ONTIMER里了,我已经用了一个ID=10的定时器,我想用这个ID=1的TIMER 就是要执行g_bCapPic = TRUE请再指点一下,谢谢! --------------------编程问答-------------------- --------------------编程问答-------------------- mark --------------------编程问答-------------------- 解决问题一定给分。
补充:.NET技术 , VC.NET