我在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平台下用电脑实现类似视速仪的功能,是否还有其它思路?

解决方案 »

  1.   

    暂不说你的定时是否合理,不过位图为128*128的话,BitBlt的目标矩形大小(257*128)超过位图大小,应该是不能正确绘制的。
      

  2.   

    多谢指教只是我在OnDraw中加入
      SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);    
      SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL);
    运行后,图形仍然无法完整显示出来,还是有问题的图形大小为256*128的
    BitBlt函数的参数是我打错了,不好意思另外,考虑时间片因素
    在VC中设置5ms定时似乎不合理的
    但要求如此,不能妥协只是我认为VC功能强大,应该不难实现程序
    怀疑是不是受限于显示器刷新性能
    还是根本与显示器无关谢谢大家!
      

  3.   

    5ms显示一个图形?当然显示不完整了。算法问题。
    改成5ms移动或高亮一下试试。也是闪的效果。呵呵。不要让它重新显示,那样时间肯定不够用。
      

  4.   

    符加,我用VB做过,每5ms移动一点点图形的位置它就会闪一下,我一直为这个郁闷呢。一直想找出让它不闪的方法。呵呵。希望我的提示能对你有帮助。我水平很差,如果说的不对,请误见笑。