【问题标题】:Timer tick when the for loop is completedfor循环完成时的计时器滴答声
【发布时间】:2013-09-05 12:20:10
【问题描述】:

当 for 循环完成时,如何计时?我不想每 X 分钟运行一次计时器,我想在单击按钮时运行计时器,然后在 for 循环完成时再次勾选计时器..

 For Each row As DataRow In MTProcessTable.Rows
  Try
            If checkKeyHelp(process.datain) Then
                msg = msgTable.Rows(1)(1).ToString()
                MsgBox(msg)
                writeMsg("1 MO help at ")

            ElseIf checkKeyInfo(process.datain) Then
                msg = msgTable.Rows(4)(1).ToString()
                MsgBox(msg)
                writeMsg("1 MO INFO at ")
            Else

                MOTable = selectMO(process.mo, process.mt)
                moRowNb = MOTable.Rows.Count()
                MO = New MO_class
                If moRowNb <> 0 Then
                    MOrow = MOTable.Rows(0)
                    MO.newuser = MOrow("newuser")
                    MO.sim_id = MOrow("sim_id")
                End If
       Catch ex As Exception
            logFile("executeTimer ----" & ex.Message)
            updateProcessed(process.id, ex.Message)
        Finally
            updateProcessed(process.id, msg)
        End Try
 Next row

Private Sub start_btn_Click(sender As System.Object, e As System.EventArgs) Handles start_btn.Click
    Timer1.Enabled = True
    tm.StartTimer()
End Sub

【问题讨论】:

  • 你为什么要为此设置一个计时器?
  • 因为当计时器启动时,我正在填充一个数据表,并且我正在对 for 循环中的每一行执行一些操作,当 for 循环完成时,函数应该重新开始并且数据表用不同数量的行重新填充......所以我不知道完成函数所需的时间,因为每次我有不同数量的行,这就是为什么我只需要在函数执行完所有的时候勾选计时器数据表中的行

标签: vb.net vb.net-2010


【解决方案1】:

根据您的评论,听起来您想编写一个程序来选择数据并进行处理。完成后,您希望通过选择新数据和处理新数据等来重新开始该过程。

如果你想使用计时器,我会设置如下。它将使用一些共享项目来启动或停止运行 sub 的计时器。一个问题是,当它运行时,程序将无响应。您可以“停止”程序的唯一时间是在两次运行之间的时间。我将线程之间的时间设置为 10 秒(10000 毫秒),但您可以使用任何值。

Imports System.Windows.Forms.Timer

Public Class Form1


    Private Sub RunProcess()
        'Add code to populate datatable
        For Each row As DataRow In MTProcessTable.Rows
            Try
                If checkKeyHelp(Process.datain) Then
                    msg = msgTable.Rows(1)(1).ToString()
                    MsgBox(msg)
                    writeMsg("1 MO help at ")

                ElseIf checkKeyInfo(Process.datain) Then
                    msg = msgTable.Rows(4)(1).ToString()
                    MsgBox(msg)
                    writeMsg("1 MO INFO at ")
                Else

                    MOTable = selectMO(Process.mo, Process.mt)
                    moRowNb = MOTable.Rows.Count()
                    MO = New MO_class
                    If moRowNb <> 0 Then
                        MOrow = MOTable.Rows(0)
                        MO.newuser = MOrow("newuser")
                        MO.sim_id = MOrow("sim_id")
                    End If
                End If
            Catch ex As Exception
                logFile("executeTimer ----" & ex.Message)
                updateProcessed(Process.Id, ex.Message)
            Finally
                updateProcessed(Process.Id, msg)
            End Try
        Next row

        Timer1.Enabled = True
    End Sub

    Private Timer1 As Timer 'Create timer

    Sub Timer1_Tick() 'Handle timer tick
        Timer1.Enabled = False
        RunProcess()
    End Sub

    Private blRunning As Boolean

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Timer1 = New Timer 'Create instance of timer
        Timer1.Interval = 10000 'Time in MS before starting next process
        AddHandler Timer1.Tick, AddressOf Timer1_Tick 'Add tick handler to timer
        Timer1.Enabled = blRunning 'Enable/disable timer
    End Sub

    Private Sub start_btn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles start_btn.Click
        If blRunning = True Then
            blRunning = False
            start_btn.Text = "Start"
        Else
            blRunning = True
            start_btn.Text = "Stop"
        End If
        Timer1.Enabled = blRunning
    End Sub
End Class

【讨论】:

  • 嗯,是的,你明白我的意思,但实际上我需要能够随时启动和停止计时器......而我的任务是使用计时器而不是线程......跨度>
  • 问题是在程序运行时,除了定时器在运行之间运行时,将无法单击开始或停止按钮。如果这是可以接受的,那么我将修改我的代码以展示如何使用计时器来启动或停止处理。
  • 好的,我更新了代码。请注意,如果不使用线程,您的程序在运行时仍将无响应。您可以尝试在某个地方添加一个标签,该标签将填充诸如“正在运行”或“睡眠”之类的文本或类似内容。这样您就可以知道何时可以单击开始/停止按钮。
  • 听起来像是 BackgroundWorker 的工作。甚至还提供免费取消支持。
  • @Steven Liekens,我同意为此使用线程或后台工作人员。然而,他说他被赋予了使用计时器的任务,而不是线程(或后台工作者)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-04
  • 1970-01-01
  • 1970-01-01
  • 2021-10-28
  • 1970-01-01
相关资源
最近更新 更多