Два таймера, якія працуюць адначасова і незалежна адзін ад аднаго

Перш за ўсё, я проста хацеў сказаць дзякуй за ўсю дапамогу, аказаную на працягу апошніх некалькіх тыдняў. Я вывучыў тону і мая праграма ратуючы мяне гадзіны і гадзіны працы кожны дзень.

Я хачу, каб пашырыць яго крыху і дадаць другі таймер, які праходзіць паралельна з першым таймерам, але не ўплывае якім-небудзь чынам форму або форму з дапамогай першага таймера.

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

Я напісаў гэта хутка, як, напрыклад:

Гэта прадугледжвае, што я дадаў кантроль вокны таймера, як 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 мс

2
Ўзгоднена, што клас Timer збіраецца з'есці цябе жыўцом. Выкарыстанне кампанента Timer, якая даступная на панэлі інструментаў, змесціце яго на форму.
дададзена аўтар Hans Passant, крыніца
Цяжка ведаць, што вы пытаецеся тут. Вы згадаю завесы і выклікі Sleep, але не паказваюць ні. Не ясна, які тып timer1 гэта. Як можна заўважыць, што ваш код не будзе нават скампіляваць (і не адфарматаваны добра).
дададзена аўтар Gideon Engelberth, крыніца
Як было адзначана раней, некалькі таймераў можа не спатрэбіцца.
дададзена аўтар dbasnett, крыніца
Так, гэта мае сэнс, аднак варта памятаць, што гэты таймер выкарыстоўваецца будзе вяртаць вынікі на асобных патоках. Акрамя таго, варта памятаць, што азначае Агульны той жа асобнік аб'екта даступны паміж патокамі. Кампутары не могуць запісаць дадзеныя з двух патокаў адначасова, так што вы павінны быць асцярожныя, што ваш код не робіць гэтага ці ажыццявіць нейкае замак. Напрыклад, у прыкладзе кода Button1 націсніце падзея запісу дадзеных агульнага аб'екта, яно павінна быць у парадку, але гэта залежыць, калі што-небудзь яшчэ і будзе рабіць гэта ў вашым дадатку! Калі вы можаце трымацца далей ад гэтага. Будзьце вельмі асцярожныя, думаць пра дадзеныя чытання/запісу
дададзена аўтар JonAlb, крыніца

3 адказы

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
3
дададзена
dbasnett, Ive спрабаваў ўсяляк, каб атрымаць гэтую працу з маім кодам не ўвянчаліся поспехам. Я паслаў вам паведамленне на vbforum
дададзена аўтар Nefariis, крыніца
@Nefarii - размясціць свой код і пытанне дзесьці. Хтосьці адказаць на яго.
дададзена аўтар dbasnett, крыніца

Вы можаце лёгка мець два (або больш) таймераў на Вас форме. Вы, здаецца, ёсць сумесь таймера на форму і таймер, які вы стварылі праграмна. Такім чынам, прыклад, які я даў, каб стварыць абодва праграмна падчас выканання.

Вызначыце аб'екты таймера ў форме:

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

Also it is worth reading about the different types of timers available to you in .NET

0
дададзена

У мяне былі некаторыя сапраўды няўдалыя досведы з System.Timers.Timer о, напрыклад, Таймер-падзея не выклікаецца.

Я б рэкамендаваў System.Threading.Timer (Акрамя таго, таму што, наколькі я ведаю, System.Timers.Timer толькі абгортка для Threading.Timer

Вось прыклад таго, як я звычайна рэалізаваць Таймеры

Звярніце ўвагу, што я заўсёды пачынаю таймер з Change-Method Пасля і перазапусціць яго ў Нарэшце Блоку метаду зваротнага выкліку для прадухілення шматразовых паралельных зваротных выклікаў аднаго і той жа таймер зваротнага выкліку-метады.

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
дададзена
Im заінтрыгаваў гэты варыянт зусім няшмат, і гэта гучыць, як ён павінен працаваць. Тым не менш, ёсць магчымасць да гэтага часу: калі timer1.enabled = дакладна? ... Я бачу, што ёсць адчужаць каманда, каб выключыць таймер, але ў мяне ёсць некалькі прыкладаў, якія патрабуюць, каб ведаць, калі таймер уключаны ці не.
дададзена аўтар Nefariis, крыніца
Вы можаце адключыць таймер выкліку _Timer1.Change (System.Threading.Timeout.Infinite, System.Threading.Timeout.Infinite) . Наколькі я ведаю, Ther ня правяраемага ўласцівасці, калі ваш таймер працуе, але вы можаце захоўваць гэтую інфармацыю самастойна ў поле Boolean (напрыклад _Timer1Running) і ўсталюйце значэнне, дзе вы пачаць або спыніць таймер. Вы таксама можаце зрабіць свой уласны таймер клас, калі вы хочаце выкарыстоўваць Enabled = True, каб уключыць таймер. Я магу змяніць свой адказ, калі вы хочаце прыклад
дададзена аўтар Nicholas, крыніца