Timer Invoke

  • VB.NET

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von Immortel.

    Hallo VB'ler,

    Ich stehe gerade vor einem Problem und hoffe ihr könnt mir auch dieses mal ein wenig dabei helfen ;-)!

    Ich versuche mich gerade ein wenig mit dem Thema Invoke auseinander zu setzten um die bekannten Thread-Übergreifenden Fehler beheben zu können.

    Zum besseren lernen habe ich mal ein kleines Test Programm entwickelt und wollte euch fragen, ob ihr mir an Hand dieses Beispiel-Programmes erklären könnt wie das mit dem Invoken genau funktioniert ;-)!

    Zeit-Programm:
    Am Start wird eine Variable Sekunden = 20 deklariert.
    Nach dem Drücken auf den Button1 startet einfach der Timer, der in einem anderen Thread läuft.
    Im Timer Elapsed Event soll nun jede Sekunde bei Variable Sekunde -1 gezählt werden, und sobald er die 0 erreicht hat den Timer stopen.

    "Mit der Me.CheckForIllegalCrossThreadCalls = False Funktion funktioniert es zwar, aber ist natürlich eine Unsaubere Art wie ich gelesen habe" ;-)! Daher würde ich gerne lernen wie es Richtig geht.


    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    3. '-- Variablen Deklaration --'
    4. Dim Sekunden As Integer = 20
    5. ' Me.CheckForIllegalCrossThreadCalls = False
    6. End Sub
    7. '-- erstellen des Timers --'
    8. Private Sub CreateTimer()
    9. Dim Timer1 As New System.Timers.Timer
    10. Timer1.Interval = 1000
    11. Timer1.Enabled = True
    12. AddHandler Timer1.Elapsed, New System.Timers.ElapsedEventHandler(AddressOf Me.Timer1_Elapsed)
    13. End Sub
    14. '-- Start Button wird geklickt --'
    15. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    16. CreateTimer()
    17. Timer1.Start()
    18. Button1.Enabled = False
    19. Button1.Text = "Timer läuft"
    20. Label1.Visible = True
    21. Button2.Visible = True
    22. End Sub
    23. '-- Timer Prozess beginnt --'
    24. Private Sub Timer1_Elapsed(ByVal sender As System.Object, ByVal e As System.Timers.ElapsedEventArgs)
    25. If Sekunden = 0 Then
    26. Button1.Enabled = True
    27. Button1.Text = "Timer starten"
    28. Label1.Visible = False
    29. Dim Sekunden As Integer = 20
    30. Button2.Visible = False
    31. Timer1.Stop()
    32. Else
    33. Sekunden = Sekunden - 1
    34. Dim sekundenanzeige As String = Sekunden
    35. Label1.Text = "noch " + sekundenanzeige + "s..."
    36. End If
    37. End Sub
    38. '-- Stop Button wird geklickt --'
    39. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    40. Timer1.Stop()
    41. Sekunden = 20
    42. Button1.Enabled = True
    43. Button1.Text = "Timer starten"
    44. Label1.Visible = False
    45. End Sub
    46. End Class


    Danke schon einmal im voraus für eure Hilfe! ;)
    Hi.

    In der Dokumentation steht:
    Wenn Sie die Timer-Klasse mit einem Element der Benutzeroberfläche verwenden, z. B. einem Formular oder Steuerelement, weisen Sie das Formular oder Steuerelement, das Timer enthält, der SynchronizingObject-Eigenschaft zu, sodass das Ereignis zum Thread der Benutzeroberfläche gemarshallt wird.

    Heißt: Das .NET-Framework übernimmt das Marshalling für dich, ergo ist dies kein gutes Beispiel, um Multithreading bei Windows Forms zu verstehen.

    Viel besser ist dieser MSDN-Artikel geeignet: msdn.microsoft.com/de-de/library/ms171728.aspx.
    Gruß
    hal2000