如何在线程上使用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

0

1个回答

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

1
Knight_Chester_Sun
Knight_Chester_Sun 回复caozhy: 有什么好的方法能够做realtime吗? 我暂时使用解决了上面的问题Environment.tick
大约 4 年之前 回复
caozhy
weixin_45841714 回复Knight_Chester_Sun: 10毫秒~100毫秒级,并且windows不是rtos,还受到进程优先级和其它程序的限制。
大约 4 年之前 回复
Knight_Chester_Sun
Knight_Chester_Sun 那最多能精确到什么单位?
大约 4 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
[VB.NET]多线程——线程计时器
Threading.Timer 类对在单独线程中定期运行任务十分有用。例如,可以使用线程计时器检查数据库的状态和完整性,或者备份重要文件。以下示例每两秒钟启动一个任务,并使用标志来启动使计时器停止的 Dispose 方法。本例将状态发送到输出窗口,因此在测试代码之前,应按 CONTROL+ALT+O 键以使此窗口可见。 <!--google_ad_client = "pub-833394086
.NET Framework中定时器timer的单线程与多线程使用讲解
如果你需要使用规律的时间间隔重复执行一些方法,最简单的方式是使用定时器(timer)。与下边的例子相比,定时器可以便捷、高效地使用内存和资源: ? 1 2 3 4 5 6 7 new Thread (delegate() {              while (enabled)              {         
VB.Net 中的定时器类Timer
简介如果你进行过VB6的程序设计,对Timer控件可能熟悉。每隔固定的时间间隔Timer控件将触发一段代码。对于Windows窗体这个控件非常典型,其他控件类似。但是如果你在类中而不是窗体中要使用定时功能,如何处理呢? System.Threading.Timer 类可以满足需要,这个类可以自动的使用线程池调用你的代码。命名空间引入下列命名空间:System
【Java多线程】——定时器Timer的使用
    在JDK中Timer类主要用于负责计划任务,也就是说在某个时间点开始执行一个计划好的任务。    Timer类中的方法列表如下:    serialNumber()    Timer():默认构造方法;    Timer(boolean):参数表示thread是否为守护线程    Timer(String):参数为线程名    Timer(String, boolean)    sched...
VB.NET Timer实现功能细讲
VB.NET Timer作为一个类,主要实现的功能就是计时功能。在这篇文章中,大家就可以通过详细的步骤对此应有技巧有一个充分的掌握。 AD: 2013云计算架构师峰会超低价抢票中 如果想在程序中添加定时器的话,使用VB.NET就能帮助开发人员轻松实现。要想实现这一功能,需要使用VB.NET Timer这个类来进行相关的操作。那么今天就为大家对此进行一个
MFC中利用多线程实现定时器
MFC中利用多线程实现定时器,对于学习多线程和 ontimer的同学有用
在VB的类模块中使用定时器
长久以来,由于不能直接获得VB类成员函数指针,因为无法在VB的类模块中直接使用定时器控件或定时器API,基于俺编写的获得类成员函数指针的函数,俺编写了这个带定时器功能的类,希望给朋友们一些启发。    一、新建一个类,类名称为clsTimer,类代码如下:Option Explicit* ********************************************
关于C#线程中使用定时器timer无效
在线程中,开启定时器 timer.Start()时候,无法进入timer_Tick()事件。 ------------------------------------------------------------------- 解决方案: this.Invoke(new MethodInvoker(delegate                         {  
python通过线程实现定时器timer的代码
下面介绍以threading模块来实现定时器的方法。  使用前先做一个简单试验:  import threading def sayhello():         print "hello world"         global t      
java多线程之定时器Timer
在java中,定时计划任务功能主要使用的就是Timer对象,主要有如下技术点: 实现指定事件执行指定任务 实现按照指定周期执行任务 定时器Timerschedule(TimerTask task,Date time)该方法的作用是咋爱指定的日期执行一次某一任务。这里分两种情况 - 执行任务的任务晚于当前时间,在未来执行 - 执行的时间早于当前时间,提前运行在未来执行public class
用Timer还是用BackgroundWorker实现定时更新画面的功能
用Timer还是用BackgroundWorker实现定时更新画面的功能 标签: timerobjectrandomstring工作class 2010-02-10 17:47 974人阅读 评论(0) 收藏 举报 版权声明:本文为博主原创文章,未经博主允许不得转载。 第一次发文章,水平有限,如有错误欢迎大家指出。   声明: 1,测试环境为vs2008,
在线程里面使用SetTimer定时器
// MyThreadTimer.h #pragma once  class MyThreadTimer  : public CWinThread  {  DECLARE_MESSAGE_MAP()  public:          MyThreadTimer(void);          ~MyThreadTimer(void);  public:         
VB.net编写的一个定时器(有各种功能)
因为懒得半夜起床关机所以写了这个,然后又加了一堆除了关机之外的功能,主要是定时执行任务。。。不用计划任务了~ 需要.Net Framework 4.0
MFC 中设置定时器Timer的方法
首先,要设置定时器。 在init中(或其他的初始化函数里),调用函数 [cpp] view plaincopy UINT SetTimer(      UINT nIDEvent,//定时器标记,      UINT nElapse,//间隔时间      void ( CALLBACK* lpfnTimer ) (HWND, UINT,
winform中多线程与定时器冲突
在winform中同时使用了定时器与多线程。 程序不稳定,有时会弹出异常System.InvalidOperationException。
java多线程定时器Timer的使用详解
使用过javascript的都知道有两个关于定时的方法:setTimeOut和setInterval方法,可以让一段代码持续性或者规定时间后运行。这样就可以实现定时的功能,最经典的应用就是贪吃蛇那条蛇持续性的走动。这里做一下关于定时器使用的一点小结 定时器:Timer 定时器的任务:TimerTask   定时器:Timer 一种工具,线程用其安排以后在后台线程中执行的任务。可安排任
如何在jsp中设置定时器
定时器是我们经常使用到的工具,那么如何在开发网站时使用定时器呢?下面就以jsp为例进行讲解: 定时器可以在指定的时间,指定周期内完成指定的指令,对于定期的进行操作非常有用;设置定时器的方式有许多种,本例中使用的是javax.servlet.ServletContextListener和java.util.Timer来实现;
MFC中OnTimer定时器用法
一、     单个定时器用法 定时器工作主要流程:设置定时器SetTimer,时间到后调用OnTimer函数,关闭定时器KillTimer。可以在程序初始化用SetTimer函数弄成多个线程类似,并行进行多个函数功能。 1.1 SetTimer(H,nID,elipse,NULL) 函数作用:开始nID号定时器 H:要定时的事件句柄,在MFC中不需要该参数,因为MFC封装在CWnd类中
章鱼哥出品_VB.NET 线程委托应用实例 一个简单的例子让你轻松掌握委托的用法
网上有很多关于线程和委托的问题,大家
Android - 使用Timer+Handler定时跨线程访问UI控件
示例:final Runnable updateTitleRunnable = new Runnable() { public void run() { // udpate UI controls updateActionbarText(); } }; public Handler updateTitleHandler
iOS使用定时器,并添加到子线程运行
//定时检查用户的各种消息未读数(每隔5秒钟) NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:5.0 target:self selector:@selector(checkUnreadCount) userInfo:nil repeats:YES]; //放到子线程 [[NSRunLoop mainRu
C++中利用多线程实现定时器
#ifndef CTIMER_H_ #define CTIMER_H_ #include class CTimer { public: CTimer(); ~CTimer(); void StartTimer(unsigned int nElapse); void EndTimer(); static DW
C#中定时器的区别,单线程,多线程
原文链接
vb用api做的计时器timer,完全模拟vb自带控件
某些无窗体的模块,无法使用计时器timer控件,这个模块就派上用场了,完全模拟vb自带控件,事件,属性完全与vb自带的timer控件相同,例如:mTimer.Interval = 500设置计时器时间,mTimer.Enabled = True启动计时器,mTimer.Enabled = False关闭计时器,计时器事件Private Sub mTimer_Timers()过程,完全与系统的相同
Timer计时器实现倒计时跳转
/** * android中的计时器:----Timer * 1:timer+handler * 2: * */ public class MainActivity extends Activity { private TextView text_time; int times = 5; p
iOS,子线程中NSTimer的开启和关闭
1.子线程中NSTimer的开启 首先在.m文件中声明两个属性一个是子线程 一个是子线程中的NSTimer。 @property (nonatomic, strong) NSThread *thread1;   @property (nonatomic, strong) NSTimer *threadTimer; 然后用GCD在全局全队中创建一个子线程并创建NSTimer。   __weak __...
IOS在子线程中使用定时器,将定时器添加至RunLoop中
转:http://my.oschina.net/u/936286/blog/159490 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 02 {
使用RxJava实现定时器功能
使用RxJava实现定时器功能主要使用interval 和 take 操作符。具体代码如下:private Disposable mDisposable; /** * 启动定时器 */ public void startTime() { int count_time = 10; //总时间 Observable.interval(0, 1, Ti
QT中使用另外的线程运行定时器(不用新建QThread子类)
编写QT程序时,时常会需要使用定时器QTimer来执行一些定时任务,但当定时任务执行的时间过长,则会影响整个界面的响应,因此会想到使用另一个工作线程来执行定时器,一般情况下可以选择从QThread派生一个线程类,然后重载run并执行任务逻辑,那下面就介绍一个不用从QThread派生并使用QTimer的例子。 在类定义public中添加
利用多线程实现计时器Timer功能
设计一个计时器TimerDemo,实现计时依次减少,用按钮Button实现功能 1:,设计布局如下所示: 2:布局文件设计代码,一个TextView为计时器显示,一个Button按钮调用onclick事件实现计时器功能<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.and
例说多线程定时器System.Timers.Timer
System.Timers.Timer是多线程定时器,如果一个Timer没有处理完成,到达下一个时间点,新的Timer同样会被启动,所以在使用Timer时需要注意。下面的实例显示了Timer的使用方法。using System; using System.Threading; using System.Windows;namespace TimerExp { /// <summary>
C# 线程:定时器的使用
转载请注明出处:http://www.cnblogs.com/KeenLeung/p/3911556.html Timer类:设置一个定时器,定时执行用户指定的函数。 定时器启动后,系统将自动建立一个新的线程,执行用户指定的函数。 初始化一个Timer对象: Timer timer = new Timer(timerDelegate, s,1000, 1000);
用定时器调入线程来解决线程假死情况
一般线程只能运行一次,为了让线程一直工作,常用的方法是在线程中加入while(),如下所示: while (true) {       //工作代码  } 这样如果使用不当很容易造成线程假死现象,网上有朋友提供了解决方法,就是把while()里的工作代码放到线程外创建一个外部函数,其实还有一个方法就是用定时器加载线程程序,每次定时加载一次线程。
Matlab中用Timer实现多线程机制
Matlab中Timer的使用   鉴于Matlab 中缺乏多线程机制,使用Timer 无疑是一个很重要的工具,Matlab 中Timer 是一个Java 对象。    (1) Timer 的定义    t=timer();      设置属性:    eg.  set(t,'Name','your_timer_name');      
在Qt子线程中使用定时器
项目中遇到了在Qt的一个子线程中使用定时器, 现在记录一下:   这里vacDealThread是一个继承QTread的类,里面有个QTimer*类型的成员变量m_timer, 然后重写它的run方法, 在里面使用定时器的时候,有两点需要注意:1:new QTimer()时不能加this;   2:在run()方法里一定要加上this.exec();     代码如下: v...
如何在Web程序中实现定时运行的功能?
定时器在Web中的应用 关键字: java定时器在web中的应用 在web中,定时器的启动一般随web server的启动而启动,一般有两种方法.  方法一:在web.xml里配置一个Servlet,并设置其随web server的启动而启动。然后在该Servlet的init()方法里启动定时器,在destory()方法里销毁定时器。  方法二:在web.xml里配置一个Liste
C# 定时执行方法: System.Timers.Timer及Winform使用线程,委托定时更新界面UI控件,解决界面卡顿问题
System.Timers.Timer t = new System.Timers.Timer(5000); //设置时间间隔为5秒 private void Form1_Load(object sender, EventArgs e) { t.Elapsed += new System.Timers.ElapsedEventHandler(...
C#当线程停止后,由线程创建的定时器会继续执行
测试代码  class Program { static System.Timers.Timer timer; static void Main(string[] args) { Thread t = new Thread(new ThreadStart(ThreadProc));
python使用threading.Timer实现线程循环任务定时器(一)
在进行爬虫系统开发的过程中遇到需要间隔一段时间就重复执行的任务的需求,就想实现一个线程服务在后台监控数据的抓取状态,要想实现定时循环任务的脚本可以使用linux下的crontab命令来执行,但是在一个项目里不太适用于使用这种办法,所以想启动一个线程来处理这类的小需求。在查找资料后发现可以使用 threading.Timer来实现这个代码如下:def func1(): print('Do som...
.NET System.Timers.Timer的原理和使用(开发定时执行程序)
概述(来自MSDN) Timer 组件是基于服务器的计时器,它使您能够指定在应用程序中引发 Elapsed 事件的周期性间隔。然后可以操控此事件以提供定期处理。例如,假设您有一台关键性服务器,必须每周 7 天、每天 24 小时都保持运行。可以创建一个使用 Timer 的服务,以定期检查服务器并确保系统开启并在运行。如果系统不响应,则该服务可以尝试重新启动服务器或通知管理员。 基于服务器
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 如何在网页制作中加入视频 如何在网页制作中插入视频