我在VC平台下,用RDTSC指令定时显示一个图形,定时为最长5ms,实现图形的瞬时闪烁。
功能:用电脑实现一个类似于视速仪的程序程序如下:
void CVisionView::OnDraw(CDC* pDC)
{
CVisionDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
ULONG tStart=0,tEnd=0;//计时变量
CBitmap myTestBitmap;
CDC myTestMemorydc;
myTestBitmap.LoadBitmap(IDB_BITMAP);//将要显示的图形,为128*128像素
myTestMemorydc.CreateCompatibleDC(pDC);
myTestMemorydc.SelectObject(&myTestBitmap);
tStart = (ULONG)GetCycleCount();//计时开始
pDC->BitBlt(0,0,257,128,&myTestMemorydc,0,0,SRCCOPY);//显示图形
int n=0;//for循环延时程序,时长约3ms
for(int i=0; i<1500000; i++)
{
n++;
_asm{nop} //an assembly-language statement in this line
}
CBitmap myTestBitmap;
CDC myTestMemorydc;
myTestBitmap.LoadBitmap(IDB_BITMAP5);//空白图形,遮盖上面显示了的图形
myTestMemorydc.CreateCompatibleDC(pDC);
myTestMemorydc.SelectObject(&myTestBitmap);
tEnd = (ULONG)GetCycleCount();//计时结束
pDC->BitBlt(0,0,257,128,&myTestMemorydc,0,0,SRCCOPY);//显示空白图形 ULONG tShow = tEnd-tStart;//得到图形显示的时间
tPer = (float)0.4167*tShow/1000000;//换算为ms制 (一个计数=0.4167ns,因我计算机CPU为2.4GHz)//
char Testtime[10];
sprintf(Testtime,"%fms",tPer);
CMainFrame *MFrame = (CMainFrame *)AfxGetMainWnd();
MFrame->m_wndStatusBar.SetPaneText(1,Testtime);//将显示图形用了多少ms在状态栏示出
}inline unsigned __int64 GetCycleCount()
{
__asm _emit 0x0F//RDTSC指令
__asm _emit 0x31
}; 结果:运行程序正确
在调试下看tStart,tEnd,tPer变量,图形显示过程确实只用了不到5ms问题:运行时图形无法完整显示出来,有时只显示出部分图形,有时根本没显示出图形,但每次状态栏上都有正确的显示 图形的显示时间。我电脑屏幕刷新频率为85Hz。请教:是否是由于屏幕刷新频率限制了程序运行时图形的显示?还是程序不完善?
若想在vc平台下用电脑实现类似视速仪的功能,是否还有其它思路?
解决方案 »
- WinInet如果通过post提交表单到Web服务器
- ocx路径问题
- 我设置的窗口,其中有编辑框和组合框,可是运行到这里怎么这些框都对鼠标光标没反应,然后也没法输入或选择啊
- 用ESC键退出循环
- OpenGL:改变面内某一点处的颜色值,请教思路~
- 简单问题,多谢!
- how to use syslistview32
- 如何在程序中得到FTP服务器的文件路径,以及如何设置WEB的虚拟路径?
- 在VC的资源编辑器中编辑对话框时,状态栏上会显示其位置和大小,它是以什么为单位的?
- 请问有没好的算法将二进制代码进行反序排列,并重新计算它的值!
- 求大型矩阵(2000维以上)的求逆程序,万分感谢
- mfc对话框不显示,为什么
SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL);
运行后,图形仍然无法完整显示出来,还是有问题的图形大小为256*128的
BitBlt函数的参数是我打错了,不好意思另外,考虑时间片因素
在VC中设置5ms定时似乎不合理的
但要求如此,不能妥协只是我认为VC功能强大,应该不难实现程序
怀疑是不是受限于显示器刷新性能
还是根本与显示器无关谢谢大家!
改成5ms移动或高亮一下试试。也是闪的效果。呵呵。不要让它重新显示,那样时间肯定不够用。