当前位置:编程学习 > C#/ASP.NET >>

求助:定时执行问题

刚学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如何保证能实时取到系统时间呢?要刷新吗? --------------------编程问答--------------------
引用楼主 sagc2346 的帖子:
问题好像是出在不能实时获取时间来判断。到了10点,12点也不执行,非得要按下按钮才执行。怪了。如何改,谢谢

当然不会执行了,这是是按扭时间才触发.这里设置了是没有用处的.非得用SetTimer不可.GETTIME可以取到系统时间啊,怎么了?
不知道你要实现个什么功能?讲清楚些,你想实现什么样的效果? --------------------编程问答--------------------
引用 3 楼 sagc2346 的回复:
GetCurrentTime(); 为何不行呢。怪了。 

set timer() 

因为程序里用的太多了,我都搞胡了。如果用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
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,