在VB中想模仿一种单片机亮灯的效果,用表格的每一格代表一个亮点,一行有50点,也就是有50格,从左到右开始,一格接一格,将格的颜色变为蓝色,当该格变色后,上一格应还原为原色(假设为白色),就象大厦的装饰灯的效果,但是,问题在于格与格之间的时间间隔要控制在200微秒之间,也就是亮点运动的时候肉眼看起来想一条线,据我所知VB的时钟最小单位是1毫秒,有没有办法精确到微秒?

解决方案 »

  1.   

    在vb中要做到微秒级的计时,用api:QueryPerformanceFrequency和QueryPerformanceCounter..
    不过用这种方法有时会罢工自己按实际情况决定吧。
      

  2.   

    一秒钟有24格就很流畅了!
    微秒要到CPU那搞...看看:http://www.vckbase.com/document/viewdoc/?id=1301
      

  3.   

    如果VB做不到的话,JAVA呢,VC++呢?硬件不支持那是不可能的,硬件间通信速度何止微秒
      

  4.   

    现在CPU的外频一般是100MHz,它是小于微秒,不过,显示器的刷新频率不可能达到微秒,就算程序可以实现微秒,还是得不到那个效果。何况人的视觉听觉都没有那么高的敏锐度,何必去做这些无意义的事情了?
    本人一点意见,仅供参考。
      

  5.   

    我记得我学Timer控件时,好像Interval的值最小是18毫秒,而不是1毫秒.
      

  6.   

    最理想的是图像变化与显示频率同步,这样不仅平滑而且不浪费资源。否则的话难免会产生闪烁。以前有一个代码,在Win98下能实现同步(是机器代码),但在2000下就不行了(非法操作)。我非常想要一个能在任何操作系统下实现同步显示的代码。不知哪位好心人能提供。
      

  7.   

    我参照网上的资料写了这么一个小小的测试程序,大家看看是否精确,给个意见。
    下载地址:http://www.wugao.net/download/pf.rar
      

  8.   

    要在vb中做到微秒级的计时,只有用这二个API了:
    QueryPerformanceFrequency
    QueryPerformanceCounter
      

  9.   

    用这个,你可以改一下,试试看吧!
    Option Explicit
    '  声明函数
    Private Declare Function QueryPerformanceFrequency Lib "kernel32" (lpFrequency As LARGE_INTEGER) As Long
    Private Declare Function QueryPerformanceCounter Lib "kernel32" (lpPerformanceCount As LARGE_INTEGER) As Long
    '  声明结构
    Private Type LARGE_INTEGER
        LowPart As Long
        HighPart As Long
    End TypePrivate Sub Form_Load()
        Dim PFrequency As LARGE_INTEGER
        '  获得高精度运行计数器的频率
        QueryPerformanceFrequency PFrequency
        '  延时 1000微妙
        SleepEx (PFrequency.LowPart / 1000000) * 1000, 0
    End Sub' 实现延时功能
    Private Function SleepEx(ByVal LowPart As Long, HighPart As Long) As Long
        Dim Interval As LARGE_INTEGER
        Dim Privious As LARGE_INTEGER
        Dim Current As LARGE_INTEGER
        
        '  获得高精度运行计数器的数值
        Call QueryPerformanceCounter(Privious)
        Current = Privious
        Interval.LowPart = LowPart
        Interval.HighPart = HighPart
        
        '  通过比较两次计数器的数值的差实现精确延时
        Do While (Abs((Current.HighPart * 2 ^ 16) + Current.LowPart) _
                - Abs(Privious.HighPart * 2 ^ 16) + Privious.LowPart) < _
                (Abs(Interval.HighPart * 2 ^ 16) + Interval.LowPart)
            Call QueryPerformanceCounter(Current)
        Loop
        SleepEx = 0
    End Function