You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VB.NET Timer控件多条件分支执行冲突问题求排查与代码修正指导

问题根因

  • 业务状态标记未互斥:点击新按钮时没有将其他操作的状态标记(hardwareConnect/checkingPort/writeData等)全部重置为False,上一次操作的状态残留导致多个分支同时触发
  • 删除操作无专属状态:REMOVE SAVED DATA逻辑没有绑定专属的状态标记,只要进度到89%就会执行,和当前点击的按钮无关
  • 进度条未重置:每次启动Timer前没有将进度条宽度重置为0,上一次的进度残留会导致新逻辑的百分比判断直接跳步
  • 字符串比较不可靠:直接判断百分比文本是否完全等于固定值,一旦计算出现精度偏差(比如得到49.99%或者50.01%),条件就会完全失效

修复方案

步骤1:新增删除操作的专属状态标记

在窗体类的全局声明部分新增变量:

Private removeData As Boolean = False

步骤2:修改所有按钮的点击事件

每次点击按钮时先重置所有状态、进度条和Timer参数,保证只有当前操作的状态为True,示例如下(其他按钮逻辑同理):

Private Sub btnConnect_Click(sender As Object, e As EventArgs) Handles btnConnect.Click
    ' 重置所有业务状态,避免残留
    hardwareConnect = True
    checkingPort = False
    writeData = False
    removeData = False
    ' 重置进度条到初始状态
    KryptonBorderEdge2.Width = 0
    ' 重置Timer为默认间隔(替换为你代码中原来的初始间隔值即可)
    Timer1.Interval = 100
    ' 启动Timer
    Timer1.Enabled = True
End Sub

步骤3:优化Timer Tick事件逻辑

改用数值判断百分比,修正删除分支的绑定逻辑,完整代码如下:

Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    ' 更新进度条
    KryptonBorderEdge2.Width += 1
    Dim curWidth As Integer = KryptonBorderEdge2.Width
    ' 直接计算百分比数值,避免字符串匹配的精度问题
    Dim percentage As Double = (curWidth / 404.0) * 100.0
    KryptonLabel5.Text = percentage.ToString("#0.00") & " %"

    If curWidth >= 404 Then
        Timer1.Enabled = False
    End If

    ' CONNECT按钮逻辑
    If hardwareConnect Then
        If percentage >= 50 AndAlso percentage < 51 Then
            Timer1.Interval = 10
            Label2.Text = "Hardware Found. Now attempting to connect."
        ElseIf percentage >= 100 Then
            KryptonComboBox1.Text = "OMNIKEY"
            Label2.Text = "Hardware successfully connected!"
            hardwareConnect = False
            Timer1.Enabled = False
        End If
    End If

    ' CHECK PORT按钮逻辑
    If checkingPort Then
        If percentage >= 100 Then
            MsgBox("Card format: JCOP S3CC9P9" & vbNewLine & "Connected on COM4", vbOKOnly)
            KryptonComboBox2.Text = "JCOP S3CC9P9"
            Label2.Text = "..."
            checkingPort = False
            Timer1.Enabled = False
        End If
    End If

    ' REMOVE SAVED DATA按钮逻辑
    If removeData Then
        If percentage >= 89 AndAlso percentage < 90 Then
            Label2.Text = "Finishing things up."
        ElseIf percentage >= 100 Then
            removeAll()
            MsgBox("Data Successfully Removed!", MsgBoxStyle.OkOnly)
            Label2.Text = "..."
            Timer1.Enabled = False
            removeData = False
        End If
    End If

    ' START/WRITE DATA按钮逻辑
    If writeData Then
        Select Case True
            Case percentage >= 20 AndAlso percentage < 21
                Label2.Text = "Blank Card detected."
            Case percentage >= 30 AndAlso percentage < 31
                Label2.Text = "Writing account name..."
            Case percentage >= 40 AndAlso percentage < 41
                Label2.Text = "Inserting ARQC Key and Master Key..."
            Case percentage >= 50 AndAlso percentage < 51
                Label2.Text = "Confirming Expiry Date..."
            Case percentage >= 60 AndAlso percentage < 61
                Label2.Text = "Generating PIN..."
            Case percentage >= 70 AndAlso percentage < 71
                Label2.Text = "Writing PIN and CVV..."
            Case percentage >= 80 AndAlso percentage < 81
                Label2.Text = "Confirming Track1/Track2/Track3..."
            Case percentage >= 90 AndAlso percentage < 91
                Label2.Text = "Finalizing everything. Please wait for a while..."
                Timer1.Interval = 1000
            Case percentage >= 100
                Label2.Text = "Successfully writing data to the card!"
                Timer1.Enabled = False
                writeData = False
        End Select
    End If
End Sub

内容的提问来源于stack exchange,提问作者Excel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 07:21:02