MFC怎样实现延时2ms开展函数调用

MFC怎样实现延时2ms进行函数调用
本帖最后由 VisualEleven 于 2014-08-14 09:32:20 编辑
想每隔2ms调用绘图函数,共调用200次,现在写的形如如下代码,可是这样不可以,好像一次也不调用,是不是在执行OnTimer之前While已经执行完了呢?设置SetTimer后是立刻执行一次Ontimer()还是2ms以后在执行?
while(i<200)
{
i++;
SetTimer(1,2,NULL);
}

void **Dlg::OnTimer(UINT nIDEvent) 
{
KillTimer(1);
draw();
}

也试过用Sleep延时,但是已执行程序就卡死
求高手解答应该怎样做?
------解决方案--------------------
直接在ontime里执行函数
1..在resource.h中定义两个定时器的ID
#define TIMER1 1
2.在CMainFrame的OnCreate函数中定义两个定时器的属性
SetTimer(TIMER1,200,0);//200ms延时
3.OnTimer(UINT nIDEvent)
{
switch(nIDEvent)
{
case Timer1:
{

//你要做的事情
}

}

}
4.在CMainFrame的析构函数中添加释放定时器函数。
              KillTimer(TIMER1);



------解决方案--------------------
while循环毫无意义,定义一个全局或静态变量来计算次数
------解决方案--------------------
是的,“在执行OnTimer之前While已经执行完了”,正确的写法是:
int m_timer = SetTimer(1,2,NULL);
int i = 0;
 void **Dlg::OnTimer(UINT nIDEvent) 
 {
i++
if( i == 200 )
   KillTimer(m_timer);
 draw();
 }
不过还有两个问题,SetTimer是一个比较粗的定时器,最小间隔是10ms,而且很不准确,设定为10,可能是13甚至15。
第二,draw()一般2ms完不了,所以连续执行就象死了一样。
解决方法是用高精度定时器,用dx等高效绘图。

------解决方案--------------------
SetTimer最小精度是10ms,再加上WM_TIMER post和分发的时间...,估计需要用自己的定时线程来实现2ms的等待
------解决方案--------------------
SetTimer精度太低了,用多媒体定时器吧timeSetEvent()
------解决方案--------------------
还可以用
DWORD WINAPI WaitForSingleObject(
    __in HANDLE hHandle,
    __in DWORD dwMilliseconds
    )
配合一个事件对象: HEVENT hEvent = CreateEvent(NULL,TRUE,FALSE,NULL) //手动复位、初始无信号状态

while(i<200)
{
    WaitForSingleObject(hEvent,2);  //等2毫秒
    draw();
    ++i;
}

想每隔2ms调用绘图函数,共调用200次
------------------------------------------------------------
如果你想每隔2ms调用绘图函数的话,while循环应该要放在一个线程当中,通过消息方式通知窗口绘图,而不是同步顺序执行
------解决方案--------------------
你要启动200个时钟?
这不太合理吧
------解决方案--------------------
引用:
直接在ontime里执行函数
1..在resource.h中定义两个定时器的ID
#define TIMER1 1
2.在CMainFrame的OnCreate函数中定义两个定时器的属性
SetTimer(TIMER1,200,0);//200ms延时
3.OnTimer(UINT nIDEvent)
{
switch(nIDEvent)
{
case Timer1:
{

//你要做的事情
}

}

}
4.在CMainFrame的析构函数中添加释放定时器函数。
              KillTimer(TIMER1);