threading timer-如何在线程上使用timer来做一个定时器 in VB.NET

问题描述

如何在线程上使用timer来做一个定时器 in VB.NET

代码如下。思路是这样的:在线程中使用threading.timer,1ms执行一次,使GLO_TICK++。Calculate_Interval 用来计算间隔时间。
实际上TimerTask不是1ms执行一次,这是为什么?

 Module Module1
    Class StateObjClass
        ' Used to hold parameters for calls to TimerTask
        Public SomeValue As Integer
        Public TimerReference As System.Threading.Timer
        Public TimerCanceled As Boolean
        Public GLO_TICK As Long
    End Class

    Public StateObj As New StateObjClass
    Public long_Temp1 As Long
    Public int16_temp1 As Int16

    Sub RunTimer()

        StateObj.TimerCanceled = False
        StateObj.SomeValue = 1
        Dim TimerDelegate As New Threading.TimerCallback(AddressOf TimerTask)
        ' Create a timer that calls a procedure every 2 seconds.
        ' Note: There is no Start method; the timer starts running as soon as
        ' the instance is created.
        Dim TimerItem As New System.Threading.Timer(TimerDelegate, StateObj, _
                                                   0, 1)
        StateObj.TimerReference = TimerItem  ' Save a reference for Dispose.
        Dim a As Boolean = False

        Dim state As Int16
        While True ' Run for ten loops.
            'System.Threading.Thread.Sleep(1000)  ' Wait one second.

            Select Case state
                Case 0
                    If a Then
                        long_Temp1 = StateObj.GLO_TICK
                    Else
                        a = True
                        long_Temp1 = StateObj.GLO_TICK
                        Console.WriteLine("a=" & a & Now)
                    End If
                    state = 1
                    Exit Select
                Case 1
                    Calculate_Interval(long_Temp1, int16_temp1)
                    If int16_temp1 > 100 Then
                        a = False
                        long_Temp1 = StateObj.GLO_TICK
                        Console.WriteLine("a=" & a & Now)
                        state = 2
                    End If
                    Exit Select
                Case 2
                    Calculate_Interval(long_Temp1, int16_temp1)
                    If int16_temp1 > 100 Then
                        a = True
                        long_Temp1 = StateObj.GLO_TICK
                        Console.WriteLine("a=" & a & Now)
                        state = 1
                    End If
                    Exit Select
            End Select

        End While

        StateObj.TimerCanceled = True  ' Request Dispose of the timer object.
    End Sub

    Sub TimerTask(ByVal StateObj As Object)
        Dim State As StateObjClass = CType(StateObj, StateObjClass)

        If State.TimerCanceled Then    ' Dispose Requested.
            System.Diagnostics.Debug.WriteLine("Done  " & Now)
            State.TimerReference.Dispose()
        End If

        System.Threading.Interlocked.Increment(State.GLO_TICK)
    End Sub
    Sub Main()
        RunTimer()
        Console.Read()

    End Sub

    Function Calculate_Interval(ByVal IntervalStart As Long, ByRef Interval_ms As Int16) As Int16
        Interval_ms = Convert.ToInt16(StateObj.GLO_TICK - IntervalStart)
        Return Interval_ms
    End Function

End Module

解决方案

没有定时器能保证1ms的定时精度。你非要这么做,得死循环。

时间: 2024-11-10 00:38:27

threading timer-如何在线程上使用timer来做一个定时器 in VB.NET的相关文章

写一个定时器Timer,随服务器一起启动

问题描述 1.搭建SSH框架环境2.写一个定时器Timer,随服务器一起启动.3.做一个前台页面,有两个按钮<开始>.<停止>能控制Timer.4.在前台页面再做一个文本框和一个提交按钮,在文本框里输入数字,点击提交能控制Timer的时间间隔.如:输入"1111",点击提交后,Timer的时间间隔就为1111毫秒.5.做一个类Count,这个类必须由spring管理,不能修改.Timer每执行一次就调用这个类的count()方法,要求输出Timer是第几次被调用

c#改变进程主窗口后,窗口上的timer,backgroundworker异常

问题描述 c#改变进程主窗口后,窗口上的timer,backgroundworker异常 原先program里的application.run是登录窗口,我现在改为主页面后,主页面上的timer控件设定的是1分钟执行1次,但是实际却1分钟执行3-5次,timer控件控制的backgroundworker也是,isbusy属性一直都是false,哪怕独立线程没结束,还是会运行.之前还好好的呢,为啥? 图片是main入口 下面是主页面上的1个timer和对于的独立线程. /// /// 数据质量监控

timer的用法-javax.swing.Timer中的线程是不是守护线程,盼大神指点

问题描述 javax.swing.Timer中的线程是不是守护线程,盼大神指点 这是源代码 import java.awt.*; import java.awt.event.*; import javax.swing.*; class mytime implements ActionListener { Timer time; int n=0; mytime() { time=new Timer(1000,this); time.start(); } public void actionPerf

线程休眠java-一个线程类休眠1000毫秒和一个线程对象休眠1000毫秒有什么联系吗

问题描述 一个线程类休眠1000毫秒和一个线程对象休眠1000毫秒有什么联系吗 一个线程类休眠1000毫秒和一个线程对象休眠1000毫秒有什么联系吗 只有线程类及其子类对象才可以调用sleep方法吗 Thread.sleep(1000); Thread thread =new Thread ( ); thread.sleep(1000); 解决方案 本质上sleep是Thread类的静态方法,这两行代码是一样的含有,但是第二种thread.sleep的调用会报警告的:The static met

mfc-用MFC做一个简单的文件上传的程序 ,上传过程中的暂停和继续怎么实现?

问题描述 用MFC做一个简单的文件上传的程序 ,上传过程中的暂停和继续怎么实现? rt 解决方案 能不能中断和继续取决于服务器怎么实现的,服务器必须具有分块接收上传文件的能力. 解决方案二: 你要把你的主要实现和主界面分开,就是用多线程,一个线程用于处理数据,主界面线程用于显示和接受用户操作,当用户按开始按钮时,开启处理线程,暂停时暂停处理线程,继续时再唤醒处理线程就行了. 解决方案三: java Web && 文件上传--简单实现

如何做一个从打开一个窗口到这个窗口显示到屏幕上的进度条

问题描述 我想做一个数据库查询的窗口,由于数据库比较大查询的时间较长,所以在"StatusStrip"上做了一个进度条,让这个进度条显示从数据库查询窗口载入到数据库查询完毕然后将查询的结果添加至"datagridview"上. 解决方案 解决方案二:关注一下.可以用线程委托.解决方案三:能不能给个类似的例子学习一下解决方案四:这是我很早以前翻译的一篇文章:<利用辅助线程更新用户界面>http://www.vckbase.com/document/view

线程-Java网络棋牌游戏中的定时器

问题描述 Java网络棋牌游戏中的定时器 现在正在做一个棋牌游戏的项目,其中的定时器怎么实现好了? 我想是用一个线程去轮询桌子上用户操作状态去判断是否操作超时,这样做的话系统开销会不会很大. 还有什么好的解决方案,不吝赐教. 解决方案 在线等!!!!!!!!!! 解决方案二: 你可以尝试使用Quartz定时器.这是个开源的框架,使用简便.可以到官网去看看.

用VB6做一个简单的文件上传组件(一)

最近在单位做的一个项目里需要有文件上传的功能正好手头一本书的附赠光盘里有一个上传组件心中大喜.可惜随之便发现这是一个试用版不给钱就只能用50次太小气了好在头头催得不紧时间充裕干脆自己试着做一个既可长经验值又能长成就感不试白不试以下介绍的便是俺折腾了两天半捣鼓出来的一个只能说是雏形的玩意区区三十行代码大侠们不要笑俺哦这只是写给与俺一样好奇心强但经验值低的弟兄们看的.    文件上载所需的第一步当然是进入一个有"file"表单元素的页面具体就不说了大家都知道.但是若想做一个能够接受该文件并

细节上的用户体验做到位可以决胜千里

文章描述:用户体验之路 步步惊心. 百度百科说,用户体验(User Experience,简称UE)是一种纯主观在用户使用产品过程中建立起来的感受.但是对于一个界定明确的用户群体来讲,其用户体验的共性是能够经由良好设计实验来认识到.良好的用户体验是产品的制胜之道. 现在的网站,很多大同小异,做人无我有,人有我精,基本上就是一句乌托邦式的口号,所以,大家拼不过姿势拼知识,拼不过知识拼胆识,拼不过胆识拼不要脸--总之,条条大路通罗马,成王败寇.姿势嘛就是设计,知识嘛就是内容,胆识嘛就是创意,不要脸嘛