子弹头的专栏

运动是事物发展的必然过程,而移动是运动最直接的形式。移动办公、移动商务、移动通讯、移动媒体、移动娱乐、移动博客……最后是移动生产力。

用户操作
[即时聊天] [发私信] [加为好友]
子弹头ID:yanyouning
123425次访问,排名692好友0人,关注者12
yanyouning的文章
原创 38 篇
翻译 2 篇
转载 77 篇
评论 137 篇
子弹头的公告


在互动出版网购买此书
在当当网购买此书
在华储网购买此书

★博主湘南衡州人氏,思古东汉之蔡伦,念今现代之琼瑶,幸与二老同乡。现游学南粤之域,主攻软件工程,以有限元驰骋天下。然天性喜好软硬兼施,以研究软件、虚拟世界为人生最大乐事。空暇喜玩文字,把酒当歌,风花雪月,不亦乐乎!近儿转玩古典哲学,常以哲语警世之言挂齿,虔诚揣摩,不忍释手,有道是:心中无尘事,莲花自在开!

最近评论
Ricky:去电脑城逛逛,满市场的“番茄花园”安装盘,人家能做到这种市场份额也是相当有能耐的,微软能吗?
不过我是不喜欢用番茄XP的,感觉“上海政府版”更好用,不那么花里胡哨。
leiki_liu:盗版需要学习软件工程吗,需要学习算法吗,需要学习架构和模式设计吗?作盗版的人,就是软件业里的低能儿。
中国的微软 :看不起作盗版软件 你找个大学生 做个盗版出来看看 狗P 大学生看都看不懂
egman:好文,给我提了个醒,
只是没有多少解决方案,有点说了白说的感觉
ta:高科技这样有点过了吧,看了他那些东西实在没有什么很高深的技术,不过有很多商业头脑,可惜没有用对地方。
文章分类
收藏
    相册
    帖图
    我的链接
    《.NET Compact Framework 移动开发指南》章节连载
    推荐——>影墙网络相册
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky

    原创 NETCF开发之比较两种Timer类收藏

    新一篇: 移动开发之我见 | 旧一篇: 从今天开始,要参加单位为期一周的培训,NETCF技术写作更新延缓

    如果要求线程按照规定的时间间隔周期性地执行的话,可以使用Timer类将需要调用的方法加入队列等待周期性执行。Timer类包含在System.Threading命名空间。Timer类通过系统提供的线程池线程在每次计时器期满时运行计时器委托。因为System.Threading.Timer对象是在单独的线程中执行,因此在退出应用程序之前需要完全终止计时器。

    .NET Compact Framework中的其他Timer类,比如System.Windows.Forms命名空间的Timer类与System.Threading命名空间的Timer类有所不同。System.Windows.Forms.Timer类每次计时器期满时产生WM_TIMER系统消息来触发事件,不能使用单独的线程来执行。System.Windows.Forms.Timer类使用简单且适合用于周期性的更新用户界面。如果需要高精度的计时器,则应该使用System.Threading.Timer

    23-3展示了使用不同Timer类的精确程度比较。在如图23-3所示的应用程序中分别创建了System.Threading.TimerSystem.Windows.Forms.Timer实例,并设置时间间隔为100毫秒。

     

    23-3:不同Timer类的精确性比较

     

    这个TimerDemo应用程序测量不同Timer类的平均时间间隔。当点击“模拟界面操作”按钮时,应用程序产生一个额外的处理活动,使不同Timer类在行为上的差别更加清晰明显。Windows.Forms.Timer对象从消息队列接收到一个WM_TIMER消息时调用它自己的委托。Windows.Forms.Timer是单线程组件,精度限定为55毫秒。当应用程序处理繁忙时,时间间隔小于55毫秒的WM_TIMER消息会被忽略。换句话说,由于Windows.Forms.Timer的精度限制,消息队列中不能存在超过一个未处理的WM_TIMER消息,否则多余的WM_TIMER消息会重叠合并,因而丢失计时信号。而在图23-3中正确的做法是,Threading.Timer对象运行在一个单独的线程中,计时器的间隔时间一到则随时被运行。Threading.Timer对象负责处理精确度(两个Timer类的处理次数),因为“模拟界面操作”按钮被点击后,主线程的优先级被临时降低,以此模拟应用程序处于繁忙状态。清单23-7说明了TimerDemo应用程序的实现代码。

     

    清单23-7TimerDemo应用程序实现代码

    Public Class TimerDemo

     

        Private threadingTimer As Threading.Timer

        Private prevTimerTicks As Long

        Private avgTimerTicks As Long

        Private numTimerExpirations As Long

        Private timerRunning As Boolean = False

     

        Private Sub btnThreadingTimer_Click(ByVal sender As System.Object, _

    ByVal e As System.EventArgs) Handles btnThreadingTimer.Click

    If timerRunning = True Then

    timerRunning = False

    While Not threadingTimer Is Nothing

    Threading.Thread.Sleep(0)

    End While

    avgTimerTicks = avgTimerTicks / numTimerExpirations

                    lThreadingTimer.Text = "Avg. Timer Interval: " + avgTimerTicks.ToString() + _

    " ms (" + numTimerExpirations.ToString() + ")"

                    btnThreadingTimer.Text = "Start Threading Timer"

                    btnFormsTimer.Enabled = True

               Else

                    timerRunning = True

                    lThreadingTimer.Text = "Timer running"

                    btnThreadingTimer.Text = "Stop Threading Timer"

                    btnFormsTimer.Enabled = False

                    avgTimerTicks = 0

                    numTimerExpirations = 0

                    prevTimerTicks = Environment.TickCount

                    threadingTimer = New Threading.Timer(New _

    Threading.TimerCallback(AddressOf ThreadingTimerTick), Nothing, 0, 100)

               End If

        End Sub

     

    Private Sub btnFormsTimer_Click(ByVal sender As System.Object, _

    ByVal e As System.EventArgs) Handles btnFormsTimer.Click

    If timerRunning = True Then

    timerRunning = False

     

                    avgTimerTicks = avgTimerTicks / numTimerExpirations

                    lFormsTimer.Text = "Avg. Timer Interval: " + avgTimerTicks.ToString() + _

    " ms (" + numTimerExpirations.ToString() + ")"

                    btnFormsTimer.Text = "Start Forms Timer"

                    btnThreadingTimer.Enabled = True

               Else

                    timerRunning = True

                    lFormsTimer.Text = "Timer running"

                    btnFormsTimer.Text = "Stop Forms Timer"

                    btnThreadingTimer.Enabled = False

                    avgTimerTicks = 0

                    numTimerExpirations = 0

                    prevTimerTicks = Environment.TickCount

                    formsTimer.Interval = 100   ' 利用窗体上放置的Timer控件

                    formsTimer.Enabled = True

               End If

    End Sub

     

    Private Sub btnProcessing_Click(ByVal sender As System.Object, _

    ByVal e As System.EventArgs) Handles btnProcessing.Click

               btnProcessing.Enabled = False

               Threading.Thread.CurrentThread.Priority = Threading.ThreadPriority.BelowNormal

               For i As Long = 0 To 5000000

               Next

               btnProcessing.Enabled = True

               Threading.Thread.CurrentThread.Priority = Threading.ThreadPriority.Normal

        End Sub

     

        Private Sub ThreadingTimerTick(ByVal state As Object)

               If timerRunning = False Then

                    threadingTimer.Dispose()

                    threadingTimer = Nothing

               Else

                    Dim currentTimerTicks As Long = Environment.TickCount

                    avgTimerTicks = avgTimerTicks + (currentTimerTicks - prevTimerTicks)

                    numTimerExpirations = numTimerExpirations + 1

                    prevTimerTicks = currentTimerTicks

               End If

        End Sub

     

    Private Sub formsTimer_Tick(ByVal sender As System.Object, _

    ByVal e As System.EventArgs) Handles formsTimer.Tick

    If timerRunning = False Then

    formsTimer.Enabled = False

                    formsTimer = Nothing

               Else

                    Dim currentTimerTicks As Long = Environment.TickCount

                    avgTimerTicks = avgTimerTicks + (currentTimerTicks - prevTimerTicks)

                    numTimerExpirations = numTimerExpirations + 1

                    prevTimerTicks = currentTimerTicks

               End If

        End Sub

     

    End Class

     

    发表于 @ 2006年07月28日 09:20:00|评论(loading...)|编辑

    新一篇: 移动开发之我见 | 旧一篇: 从今天开始,要参加单位为期一周的培训,NETCF技术写作更新延缓

    评论

    #过客 发表于2006-10-30 18:17:00  IP: 218.28.130.*
    .NET对象研究地还是比较深入嘛,呵...
    发表评论  


    登录
    Csdn Blog version 3.1a
    Copyright © 子弹头