Два таймера работают одновременно и независимо - PullRequest
2 голосов
/ 28 октября 2011

Прежде всего, я просто хотел сказать спасибо за помощь, оказанную в последние пару недель.Я многому научился, и моя программа каждый день экономит мне часы и часы работы.

Я хочу немного его расширить и добавить второй таймер, который работает параллельно первому таймеру, ноПервый таймер не влияет ни на какую форму.

Я пытался вложить второй цикл в первый цикл, но второй цикл занимает 3 секунды (я использую thread.sleep (3000))Таким образом, я обнаружил, что первый цикл заморозился до окончания второго цикла.Я читал о многопоточности системы (System.Timers.Timer), и мне кажется, что это тот путь, по которому я хочу идти.

Я написал это быстро в качестве примера:

Это предполагает, что я добавил элемент управления таймера Windows как timer1

Option Strict On
Imports System
Imports System.Timers

Public Class form1

  Private Shared timer2 As System.Timers.Timer
  timer2 = New System.Timers.Timer
  AddHandler timer2.Elapsed, AddressOf OnTimedEvent

  Public Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
                           Handles Button1.Click
    timer1.Interval = 1000
    timer1.enabled = true
    timer2.Interval = 5000
    timer2.Enabled = True
  End sub

  Public Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) _
                         Handles Timer1.Tick
  'code for timer1 here
  End Sub

  Private Shared Sub OnTimedEvent(source As Object, e As ElapsedEventArgs)
    'code for timer2 here
  End Sub

End Class 

Имеет ли это смысл? ... иопять же, я не могу использовать timer1 для запуска второго раунда событий из-за thread.sleep.Я надеялся, что приведенный выше код переводит второй поток в спящий режим, в то время как windows.form.timer продолжает тикать каждые 1000 мс

Ответы [ 3 ]

3 голосов
/ 28 октября 2011
Public Class Form1
    'a timer that fires periodically
    Dim WithEvents aTimer As New System.Threading.Timer(AddressOf TickTock, Nothing, 0, 500)
    'a stopwatch for each event
    Dim swEV1 As New Stopwatch
    Dim swEV2 As New Stopwatch
    'how long between executions
    Dim ev1Time As New TimeSpan(0, 0, 1)
    Dim ev2Time As New TimeSpan(0, 0, 5)

    'test
    Private Sub Button1_Click(sender As System.Object, _
                              e As System.EventArgs) Handles Button1.Click
        Button1.Enabled = False
        'start the test
        swEV1.Start()
        swEV2.Start()
    End Sub

    Dim ev1 As New Threading.Thread(AddressOf event1)
    Dim ev2 As New Threading.Thread(AddressOf event2)

    Private Sub TickTock(state As Object)
        If swEV1.IsRunning Then
            'check the elapsed time and run the thread when needed
            'only one thread per event is allowed to run
            If swEV1.Elapsed >= ev1Time Then
                If Not ev1.IsAlive Then
                    swEV1.Reset() 'reset the stopwatch
                    swEV1.Start()
                    ev1 = New Threading.Thread(AddressOf event1)
                    ev1.IsBackground = True
                    ev1.Start()
                End If
            End If

            If swEV2.Elapsed >= ev2Time Then
                If Not ev2.IsAlive Then
                    swEV2.Reset()
                    swEV2.Start()
                    ev2 = New Threading.Thread(AddressOf event2)
                    ev2.IsBackground = True
                    ev2.Start()
                End If
            End If

        End If
    End Sub

    Private Sub event1()
        Debug.WriteLine("EV1 " & DateTime.Now.ToString)
        Threading.Thread.Sleep(500) 'simulate work
    End Sub

    Private Sub event2()
        Debug.WriteLine("EV2 " & DateTime.Now.ToString)
        Threading.Thread.Sleep(3000) 'simulate work
    End Sub


End Class
0 голосов
/ 28 октября 2011

У меня был действительно плохой опыт работы с System.Timers.Timer, например, Таймер-событие не вызывается.

Я бы порекомендовал System.Threading.Timer (также потому, что, насколько мне известно, System.Timers.Timer является только оболочкой для Threading.Timer

Вот пример того, как я обычно применяю Таймеры

Обратите внимание, что я всегда запускаю таймер с помощью метода изменения один раз и перезапускаю его в блоке «Конец» метода обратного вызова, чтобы предотвратить несколько параллельных обратных вызовов одного и того же метода таймера обратного вызова.

Public Class Form1

   Private _Timer1 As System.Threading.Timer
   Private _Timer2 As System.Threading.Timer

   Public Sub New()

      ' This call is required by the designer.
      InitializeComponent()

      ' Add any initialization after the InitializeComponent() call.
      _Timer1 = New System.Threading.Timer(AddressOf Timer1_Callback)
      _Timer2 = New System.Threading.Timer(AddressOf Timer2_Callback)

   End Sub

   Private Sub Timer1_Callback(ByVal state As Object)
      Try

         'code for timer1 here

      Catch ex As Exception
         'Do your errorhandling
      Finally
         'Start with a delay. Just call the Callback once
         _Timer1.Change(1000, System.Threading.Timeout.Infinite)
      End Try
   End Sub
   Private Sub Timer2_Callback(ByVal state As Object)
      Try

         'code for timer2 here

      Catch ex As Exception
         'Do your errorhandling
      Finally
         'Start with a delay. Just call the Callback once
         _Timer2.Change(5000, System.Threading.Timeout.Infinite)
      End Try
   End Sub

   Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
      Try
         'Start with a delay. Just call the Callback once
         _Timer1.Change(1000, System.Threading.Timeout.Infinite)
         _Timer2.Change(5000, System.Threading.Timeout.Infinite)
      Catch ex As Exception
         'Do your errorhandling
      End Try
   End Sub
End Class
0 голосов
/ 28 октября 2011

Вы можете легко иметь два (или более) таймера в вашей форме. Кажется, у вас есть смесь таймера в форме и таймера, который вы создали программно. Итак, пример, который я привел, заключается в том, чтобы создать их оба программно во время выполнения.

Определите ваши объекты таймера в вашей форме:

Private Shared timer1 As System.Timers.Timer
Private Shared timer2 As System.Timers.Timer

Определить два обработчика для прошедших событий:

Public Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs)
'code for timer1 here
end sub

Public Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs)
'code for timer2 here
end sub

Затем, нажав кнопку, вы можете добавить обработчики и запустить таймеры:

Public Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    'Add handlers programatically
    AddHandler timer1.Elapsed, AddressOf Timer1_Tick
    AddHandler timer2.Elapsed, AddressOf Timer2_Tick

    'Set up the timer intervals and start them
    timer1.Interval = 1000
    timer1.enabled = true
    timer2.Interval = 5000
    timer2.Enabled = True

End sub

Также стоит прочитать о различных типах таймеров, доступных вам в .NET

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...