说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

请问在VB.net中如何实现高精度定时,达到ms级即可。

编辑:说三道四文库 发布时间:2018-08-15 03:10
HTML文档下载 WORD文档下载 PDF文档下载
用VB.net自带的Timer组件定时,精度太低,拌动得厉害,在不同的系统和机器上有不同的表现。
你用的是Controls下的timer控件还是Threading下的timer,后者精确一些
用的Controls下的timer

我用Threading下的试试。
另外我在一些资料中看到用API函数:
Private Declare Function timeSetEvent Lib "winmm.dll" (ByVal uDelay As Long, ByVal _
        uResolution As Long, ByVal lpFunction As Long, ByVal dwUser As Long, _
        ByVal uFlags As Long) As Long
Private Declare Function timeKillEvent Lib "winmm.dll" (ByVal uID As Long) As Long

在VB6中工作很好,但在VB.net中当运行一段时间后就会报错。或者当定时时间到后的执行回调函数的时间稍长时也会出错。
但用VB6做一下封装,在IDE环境下执行很好,但编译后在回调函数中用指令Raiseevent时总是报错。
把应用程序的优先级设置高些,以免别的程序占用太多CPU时间,ms级反映太快,必须这样设置
Threading下的Timer和Controls下的Timer差不多。有一个System.Timers下的Timer精度还要高一些。

请问上面提到的用API为什么会出现这样的问题?
我已线程的优先级设为最高。请问如何获取当前程序运行的进程?
设置Process.PriorityClass 属性

BasePriority    PriorityClass 
4               Idle  
8               Normal  
13              High  
24              RealTime  


[Visual Basic] 
Imports System
Imports System.Diagnostics
Imports System.Threading

Namespace Process_Sample
   Class MyProcessClass

      Public Shared Sub Main()
         Try

            Dim myProcess As Process
            myProcess = Process.Start("NotePad.exe")

            While Not myProcess.HasExited

               Console.WriteLine()
               
               ' Get physical memory usage of the associated process.
               Console.WriteLine("Process's physical memory usage: " + _
                                      myProcess.WorkingSet.ToString)
               ' Get base priority of the associated process.
               Console.WriteLine("Base priority of the associated process: " + _
                                      myProcess.BasePriority.ToString)
               ' Get priority class of the associated process.
               Console.WriteLine("Priority class of the associated process: " + _
                                      myProcess.PriorityClass.ToString)
               ' Get user processor time for this process.
               Console.WriteLine("User Processor Time: " + _
                                      myProcess.UserProcessorTime.ToString)
               ' Get privileged processor time for this process.
               Console.WriteLine("Privileged Processor Time: " + _
                                   myProcess.PrivilegedProcessorTime.ToString)
               ' Get total processor time for this process.
               Console.WriteLine("Total Processor Time: " + _
                                     myProcess.TotalProcessorTime.ToString)
               ' Invoke overloaded ToString function.
               Console.WriteLine("Process's Name: " + myProcess.ToString)
               Console.WriteLine("-------------------------------------")

               If myProcess.Responding Then
                  Console.WriteLine("Status:  Responding to user interface")
                  myProcess.Refresh()
               Else
                  Console.WriteLine("Status:  Not Responding")
               End If
               Thread.Sleep(1000)
            End While

            Console.WriteLine()
            Console.WriteLine("Process exit code: {0}", myProcess.ExitCode)

         Catch e As Exception
            Console.WriteLine("The following exception was raised: " + e.Message)
         End Try
      End Sub 'Main
   End Class 'MyProcessClass
End Namespace 'Process_Sample
调整进程的优先级也没有用。
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘