System.Timers.timer系统定时器重复使能时事件会重入,怎么解决??

shuangyuego 2015-05-08 09:55:15
事件处理时间比间隔长,已经写了防止重入的Interlocked.Exchange()标志。按键引发定时器计时,窗口第一次打开使用没问题,再次按键就会重入,最多重入三次。这是什么问题?
...全文
572 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tiger_Zhao 2015-05-11
  • 打赏
  • 举报
回复
你在说什么?不理解!不理解!!
Tiger_Zhao 2015-05-11
  • 打赏
  • 举报
回复
Private iStep       As Integer

Sub Button1Click()
处理
Button1.Enabled = False
num1 = GetTickCount
iStep = 1
ti1.AutoReset = True
ti1.Interval = 1000
ti1.Enable = True
End Sub

Sub Button2Click()
处理
Button2.Enabled = False
num1 = GetTickCount
iStep = 2
End Sub

Sub Button2Click()
处理
Button3.Enabled = False
num1 = GetTickCount
iStep = 3
End Sub

Sub ti1_Elapsed()
If iStep = 0 Then
Exit Sub
End If

If Interlocked.Exchange(isbusy1, 1) = 0 Then
num2 = GetTickCount
If num2 - num1 > 10000 Then
Select Case iStep
Case 1
处理1
Button2.Enabled = True
Case 2
处理2
Button3.Enabled = True
Case 3
处理3
Button1.Enabled = True
End Select
iStep = 0
End If
Interlocked.Exchange(isbusy1,0)
End If
End Sub
shuangyuego 2015-05-11
  • 打赏
  • 举报
回复
是这样的,窗体上是一个控制流程,流程中按顺序有3个定时程序,由按键使能,定义了3个了系统定时器ti1,ti2,ti3: Sub Button1Click: 处理 Button1.Enabled=False num1=GetTickCount ti1.Enable=True ti1.AutoReset=True ti1.Interval=1000 End Sub Sub ti1_Elapsed if Interlocked.Exchange(isbusy1,1)=0 Then num2=GetTickCount if num2-num1>10000 Then 处理 Button2.Enabled=True while(Button2.Enabled=True) Applicatiojn.DoEvents() End While End if Interlocked.Exchange(isbusy1,0) End if End Sub Sub Button2.Click Button2.Enabled=false ti2.Enabled=True ........和Button1结构一样 Sub ti2_Elapsed ......和ti1_Elapsed结构一样,参数换成isbusy2,Button3 以此类推 Button3Click中使能ti3 ti3_Elapsed中参数isbusy3,结束整个流程 问题是运行加载窗体后按顺序点击Button1,Button2,Button3流程正常,第二遍点击Button1再来一遍时,ti3_Elapsed过程重复执行了,第三遍时执行了3次。若关闭窗体重新运行就没问题。
shuangyuego 2015-05-08
  • 打赏
  • 举报
回复
引用 1 楼 Tiger_Zhao 的回复:
    Private Sub tm_Elapsed(ByVal sender As Object, ByVal e As System.Timers.ElapsedEventArgs) Handles tm.Elapsed
        Static isBusy As Boolean = False
        If isBusy Then Exit Sub
        isBusy = True

        长时间的处理()

        isBusy = False
    End Sub
我用的是 if Interlocked.Exchange(isbusy,1)=0 then 处理() Interlocked.Exchange(isbusy,0) 和你的意思一样,但还是有重入,我的程序是可以重复执行的,只有重复执行的时候才有重入,不知道和窗体加载初始化定时器有没有关系?
Tiger_Zhao 2015-05-08
  • 打赏
  • 举报
回复
    Private Sub tm_Elapsed(ByVal sender As Object, ByVal e As System.Timers.ElapsedEventArgs) Handles tm.Elapsed
Static isBusy As Boolean = False
If isBusy Then Exit Sub
isBusy = True

长时间的处理()

isBusy = False
End Sub
shuangyuego 2015-05-08
  • 打赏
  • 举报
回复
不是变量的问题,每一个定时器都设了不同的,还是这样。不知道重新加载窗体是起到了什么作用,重新打开后第一次运行没有问题
Tiger_Zhao 2015-05-08
  • 打赏
  • 举报
回复
不是很理解。
如果要在不同的定时事件中,按步骤1、2、3顺序执行,还是用一个定时器啊。
    Private Sub tm_Elapsed(ByVal sender As Object, ByVal e As System.Timers.ElapsedEventArgs) Handles tm.Elapsed
Static isBusy As Boolean = False
Static iStep As Integer = 0

If isBusy Then Exit Sub
isBusy = True

Select Case iStep
Case 0
步骤1()
Case 1
步骤2()
Case 2
步骤3()
End Select
iStep = (iStep + 1) Mod 3

isBusy = False
End Sub
shuangyuego 2015-05-08
  • 打赏
  • 举报
回复
引用 3 楼 Tiger_Zhao 的回复:
可以重复执行? 难道你两个程序实例共享 isbusy 标志了?
不是这个意思,是执行完一遍才能再点击按钮从头来,不是同时的。过程中有3个定时器,按顺序使能,也不同时,没有交叉,它们倒是用的一个标志。应该也不影响啊
Tiger_Zhao 2015-05-08
  • 打赏
  • 举报
回复
可以重复执行?
难道你两个程序实例共享 isbusy 标志了?
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明

16,554

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧