用timeGetTime函数定时50ms,在50ms内计时,按时间逐行查数据库记录,再调用厂家提供的dll函数输出给硬件。处理时间超过了50ms,造成定时器被拖后,4分钟的任务花了8分钟。
现在提出采用多线程的办法,把硬件输出函数放到一个线程中执行,不知怎么样???
大家说说。

解决方案 »

  1.   

    下面的代码用计时代替定时,这样即使用 Debug.Print 模拟的一次操作超过 50ms,下次操作会马上触发而不用再等 50ms。Option ExplicitPrivate Declare Function QueryPerformanceCounter Lib "kernel32" (lpPerformanceCount As Any) As Long
    Private Declare Function QueryPerformanceFrequency Lib "kernel32" (lpFrequency As Any) As LongPrivate start As Currency
    Private frequency As CurrencySub Main()
        Dim nextMS As Long
        Dim currentMS As Long
        
        QueryPerformanceFrequency frequency
        QueryPerformanceCounter start
        
        nextMS = 50
        While nextMS <= 1000
            currentMS = GetMillisecond
            If currentMS < nextMS Then
                DoEvents
            Else
                Debug.Print "Timer at " & currentMS & " ms"
                nextMS = nextMS + 50
            End If
        Wend
    End SubFunction GetMillisecond() As Long
        Dim current As Currency
        QueryPerformanceCounter current
        GetMillisecond = ((current - start) / frequency) * 1000
    End Function
      

  2.   

    现在问题是50ms内根本执行不完程序,提前结束没有意义.如果将任务分成几个线程并行执行,能不能在50ms内全部完成.