如何用VisualC++在单多文档界面面中创建视图

MFC怎样实现延时2ms进行函数调用
想每隔2ms调用绘图函数,共调用200次,现在写的形如如下代码,可是这样不可以,好像一次也不调用,是不是在执行OnTimer之前While已经执行完了呢?设置SetTimer后是立刻执行一次Ontimer()还是2ms以后在执行?
while(i&200)
SetTimer(1,2,NULL);
void&**Dlg::OnTimer(UINT&nIDEvent)&
KillTimer(1);
也试过用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)&
if(&i&==&200&)
&&&KillTimer(m_timer);
不过还有两个问题,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();
想每隔2ms调用绘图函数,共调用200次
------------------------------------------------------------
如果你想每隔2ms调用绘图函数的话,while循环应该要放在一个线程当中,通过消息方式通知窗口绘图,而不是同步顺序执行
你要启动200个时钟?
这不太合理吧
引用&1&楼&tianyuan521521&的回复:直接在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);顶
即使是一小步也想与你分享网络通信/分布式开发
sleep函数的最小延时时间竟然为10ms?
最近在使用Sleep函数延时需要延时2ms的时候,竟然发现Sleep函数是以10ms为单位进行延时的,也就是说所有小于10大于0的情况下都是10ms,所有大于10小于20的情况都是20,以此类推!大家都发现这个问题了吗?
那么下面的问题是如果我要实现2ms的延时该如何做?前提条件是与Sleep一样不能占用CPU资源,所以循环的方法就不大可行了。
procedure&SysDelay(aMs:&Longint);
&&TickCount&&&&&&&:&LongI
&&TickCount:=GetTickC
&&while&GetTickCount&-&TickCount&&&aMs&do&
&&&&Application.ProcessM
ProcessMessage难道就不消耗CPU资源了吗?能有Sleep的效率高吗?我现在不是要循环的程序还能响应其它事件,而是要CPU的占用率降低,因为这个过程本来就是用线程处理的!
大家还有更好的办法吗?还有谁能解释一下Sleep到底为何只能精确到10ms&?
我知道Ontimer事件的精度在50ms左右,你说sleep在10ms,真的侧侧,另外sleep使线程睡眠的函数,windows&NT这样的操作系统一个cpu的时间片在2ms左右,无怪胡10ms的精度。搂住要用2ms的精度
时间,建议搂住用Timer对象,他和semphore,mutex等都是windows内建对象,用的是硬件时钟,应当能
满足搂住的需要,在msdn的帮助中有,属于windows&的api,delhi没有封装的。
确实如此,它的精度只有那么高。
而且在瘟九八下精度更差得多。
getTickCount
这三个东西都是同一精度级的。
今天又试验发现:Sleep函数如果连续调用那么不足10ms的时间会同前面累加起来,也就是累加达到10ms时就休眠10ms。关于&riding(ride)&说的用Timer对象去实现,我不知道是否可行,因为我的要求是在一个死循环的循环体中能放弃2ms左右(5ms也能接受)的CPU时间,然后再继续执行后面的代码,否则的CPU的占用率太高了,而不是要求我的函数或代码多长时间去执行一次,所以Timer是否有用?之所以可以放弃2ms的CPU时间是因为我在执行一句代码后,后面必须等到2ms以后才可能有结果,所以即使不放弃这个时间我也必须要循环等待到2ms以后才能判断是否有结果,所以放弃CPU时间是最好的选择!
使用“高分辨率性能计数器”high-resolution&performance&counter
/msdnmag/issues/04/03/HighResolutionTimer/default.aspx
Sleep&的精度这个要追溯的PC的组成原理了。
它们根本上都是从8254产生的脉冲,它直接影响8259产生时钟中断,这个频率从PC开始就一直是1.19M&(好像是这个数),经过触发器的分频,它产生了每隔52ms一个int&8h中断。
dos下的sleep的精确极限就是这个52ms,
后来win95开始&进一步支持了10ms左右的精度(不知道原理),可能是8254提供了新的基准,因为它本身能产生3个时钟。
现在看不到8254了,都集中在北桥了。
8254&直接连到8255&接到PC喇叭,可以发声。
同时它还是很多游戏的始终基准,所以修改了8254的寄存器,改变这个频率,就能修改有些得速度,这就是变速齿轮的原理。
Sleep是不准确的
http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=200249
http://lysoft.7u7.net
回复
即使是一小步也想与你分享}

我要回帖

更多关于 多文档界面 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信