"Timer" in 2. Form nutzen obwohl Form geschlossen / Programm geschlossen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    "Timer" in 2. Form nutzen obwohl Form geschlossen / Programm geschlossen

    Moin Moin,
    bin vor kurzem auf den Trichter gekommen, ich könne ma wieder etwas Programmieren. Dazu eine kurze Vorgeschichte: ich hab 2014 in der Schule die ersten Programme realisiert und nach meinem Abschluss nie wieder was mit Programmieren am Hut gehabt, bis vor 3 Tagen als ich ne Idee hatte und mich die gepackt hatte mich mehr wieder mit dem Programmieren zu befassen. Daher bitte ich um etwas Nachsicht für unsauberes Programmieren und Antworten für einen VB Anfänger, sodass ich es verstehen kann.

    Zu meinem Vorhaben: Ich benötige einen Timer der in einer 2. Form zu starten und zu beenden ist. Dieser Timer soll eine Progressbar in dieser Form füllen und am ende der vorher festgelegten Zeit eine Variable X einen Wert geben.
    Dieser Timer muss jedoch die Funktion beibehalten auch wenn diese Form bzw. Das Programm geschlossen wird ("Offline betrieb").

    Idee zur Realisierung des "Offline Betriebes":
    Alle Zeiten(Anfang/Ende/Differenz o.Ä.) werde ich in einer Datei speichern lassen nach beendigen des Programmes und nach neu öffnen des Programmes entsprechend auslesen lassen. Das wird aber ein späterer Schritt für mich und nur eine Info vorab nicht das eventuell eure Lösungen später mit diesem Vorhaben nicht mehr Kompatibel sind.

    Meine Frage:
    A: Ist mein vorhaben wie ich es möchte überhaupt möglich?
    B: Im folgendem ist ein von mir Programmiertes Beispielprogramm der einen solchen funktionsfähigen Timer beinhaltet jedoch kann man ihn umgehen in dem man während des Prozesses die System Zeit entsprechend anpasst. Wie kann ich diese Lösung so abändern das es nicht mehr möglich ist die vorher Festgelegte Zeitspanne über diesen Trick zu verkürzen.
    Modul:

    Visual Basic-Quellcode

    1. Module Module1
    2. Public x As Integer = 0
    3. Public vntStartZeit As Object = "00.00.0000 00:00:00"
    4. Public vntEndZeit As Object = "00.00.0000 00:00:00"
    5. Public lngZeitDiff As Long
    6. Public timerstart As Boolean = False
    7. Public rest As Integer = 0
    8. End Module

    Form 1

    Visual Basic-Quellcode

    1. Public Class Form1
    2. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    3. Label1.Text = x & "x"
    4. End Sub
    5. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    6. Form2.Show()
    7. End Sub
    8. End Class

    Form 2

    Visual Basic-Quellcode

    1. Public Class Form2
    2. Dim Zeit As Integer = 30
    3. Dim rest1 As Boolean
    4. Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    5. Label1.Text = "Startzeit" & vbCrLf & vntStartZeit
    6. Label2.Text = "Endzeit" & vbCrLf & vntEndZeit
    7. Label3.Text = "Restzeit" & vbCrLf & rest & "Sec."
    8. Label4.Text = x & "X"
    9. If timerstart = True Then
    10. rest = DateDiff("s", Now, vntEndZeit)
    11. rest1 = rest <= 0
    12. If rest1 = False Then
    13. ProgressBar1.Maximum = lngZeitDiff
    14. ProgressBar1.Value = lngZeitDiff - rest
    15. Button1.Enabled = False
    16. Timer1.Enabled = True
    17. ElseIf rest1 = True Then
    18. vntStartZeit = "00.00.0000 00:00:00"
    19. vntEndZeit = "00.00.0000 00:00:00"
    20. rest = 0
    21. Label1.Text = "Startzeit" & vbCrLf & vntStartZeit
    22. Label2.Text = "Endzeit" & vbCrLf & vntEndZeit
    23. Label3.Text = "Restzeit" & vbCrLf & rest & "Sec."
    24. x = x + 1
    25. Label4.Text = x & "X"
    26. Form1.Label1.Text = x & "X"
    27. timerstart = False
    28. Me.Show()
    29. MsgBox("Zeit abgelaufen", vbOKOnly, "Hinweis")
    30. End If
    31. End If
    32. End Sub
    33. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    34. timerstart = True
    35. vntStartZeit = Now
    36. vntEndZeit = DateAdd("s", zeit, Now)
    37. lngZeitDiff = DateDiff("s", vntStartZeit, vntEndZeit)
    38. rest = lngZeitDiff
    39. Label1.Text = "Startzeit" & vbCrLf & vntStartZeit
    40. Label2.Text = "Endzeit" & vbCrLf & vntEndZeit
    41. Label3.Text = "Restzeit" & vbCrLf & rest & "Sec."
    42. Button1.Enabled = False
    43. ProgressBar1.Maximum = lngZeitDiff
    44. Timer1.Enabled = True
    45. End Sub
    46. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    47. ProgressBar1.Increment(1)
    48. rest1 = rest <= 0
    49. If rest1 = True Then
    50. vntStartZeit = "00.00.0000 00:00:00"
    51. vntEndZeit = "00.00.0000 00:00:00"
    52. rest = 0
    53. Label1.Text = "Startzeit" & vbCrLf & vntStartZeit
    54. Label2.Text = "Endzeit" & vbCrLf & vntEndZeit
    55. Label3.Text = "Restzeit" & vbCrLf & rest & "Sec."
    56. x = x + 1
    57. Label4.Text = x & "X"
    58. Form1.Label1.Text = x & "X"
    59. timerstart = False
    60. Timer1.Enabled = False
    61. ProgressBar1.Value = ProgressBar1.Minimum
    62. timerstart = False
    63. MsgBox("Zeit abgelaufen", vbOKOnly, "Hinweis")
    64. Button1.Enabled = True
    65. Else
    66. rest = rest - 1
    67. Label3.Text = "Restzeit" & vbCrLf & rest & "Sec."
    68. End If
    69. End Sub
    70. End Class


    P.S. ich habe mal VB 6.0 Code genommen um diesen Code hier zu implementieren ich hoffe das es richtig ist und nicht VB.net (Ich habe einfach eine Normale VB Windows Form Anwendung als Projekt gestartet)
    und in den Labels hoffentlich auch das entsprechend richtige angegeben (Visual Studio 2017 - alles neuste Version)
    MFG Barohn :P
    Jetzt versteh ich deine Frage bezüglich VB oder .NET.
    ​Meine Ursprungs Idee ist eine APP die mit meinem aktuellen Wissenstand über VB sowieso nicht realisierbar ist. Für VB entschieden habe ich mich lediglich vorerst um erstmal wieder in die Materie reinzukommen da ich es noch grob von früher kenne und man sich vieles leicht selbst beibringen kann. Ich wollte darüber zunächst die grobe Struktur meiner recht umfangreichen Idee verwirklichen und mit diesen Kenntnissen auf anderen aufzubauen.
    Sollte z.B. diese Funktion schon mal nicht mehr mit VB realisierbar sein, bin ich auch aufgeschlossen direkt umzusteigen.
    ​Für mich ist das ganze lediglich ein lerning by doing, just for fun, spaß an der Freude Projekt.
    Nur um das zu klären: Der von dir gezeigte Code ist kein vb6, sondern ist vb.net.
    Er hat allerdings einige stilistische Mängel, die sicherlich daher rühren, dass du Erfahrungen in vb6 gesammelt hast, und sie jetzt in vb.net reproduzierst.
    Und das ist ziemlich verheerend, den vb.net ermöglicht zwar - leider - vb6-Gewohnheiten zu reproduzieren (es fördert das gradezu).
    NichtsdestoTrotz ist solcher Code vom Standpunkt sauberen Codens her ziemlich grauenhaft.

    Also dringende Empfehlung: Um vernünftiges OOP-Programmieren mit vb.net zu erlernen, tätige die hier dargelegten Grundeinstellungen: Visual Studio - Empfohlene Einstellungen
    Andernfalls machst du's nur dir selber schwer bis unmöglich, und verdirbst uns die Lust zu helfen.



    Aber ich kann auch mit konkrete Tipps aufwarten:
    In .Net gibt es für Zeiten einen eigenen Datentyp - Date - alias DateTime
    Es gibt also keinen Grund (bzw. leidenschaftliche Progger kriegen Kopfweh davon), wenn eine Zeit As Object deklariert wird - also

    VB.NET-Quellcode

    1. 'statt
    2. Public vntStartZeit As Object = "00.00.0000 00:00:00"
    3. ' mach so:
    4. Public vntStartZeit As new DateTime(0L)
    So - damit solltest du beschäftigt sein - die og Grundeinstellungen, und dann deinen Code reparieren, dass er wieder kompiliert.
    Dann kann man drüber reden.

    Man kann übrigens auch vorher drüber reden, aber nur insofern es ihn zu reparieren gilt, entsprechend den "strengeren" Regeln der korrigierten Grundeinstellungen.
    Oder auf Deutsch: Wenn die Code-Anpassung nach erfolgter Umstellung dir Mühe macht - frag einfach.
    "Learning By Doing" ist ja schön, aber deswegen 2 Tage vor ieinem PillePalle-Problem zu sitzen isses nicht wert. Man muss nicht alles selbst herausfinden - manches darf man sich auch erklären lassen.

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Danke für deine Antwort und diesen Hinweis :D also sollte ich in Zukunft auch garnicht nach VB suchen sondern eher nach .NET?
    Habe auch gleich mal die Einstellungen geändert (schon doof das die Standart Einstellung darauf nicht von Anfang an Rücksicht nehmen) und wie erwartend viele rote striche :P
    Bin der Lösung aber noch nicht viel näher gekommen und würd mich freuen wenn du nochmal drüberschauen kannst, ob es nun etwas sauberer ausschaut und mit eventuell einen Neuen Tipp geben :P
    Das mit dem Object hatte ich schon vorher gelesen und wusste wie *** es war. Hatte es mit Date allein probiert, hatte aber nicht funktioniert. Mit Object war dann wohl einfach mal Jugendlicher Leichtsinn und die augenscheinlich einfachste Lösung.
    Ein Paar Sachen habe ich erstmal als Kommentar deklariert und werde mich damit nochmal später befassen. Hab aber eine neue Frage und zwar:
    ich sollte ja

    VB.NET-Quellcode

    1. Public vntStartZeit As new DateTime(0L)

    verwenden.
    Musste aber das (0L) weglassen, da wenn ich dieses verwende immer Fehlermeldungen kommen.
    -z.B. Schweregrad Code Beschreibung Projekt Datei Zeile UnterdrückungszustandFehler BC30518 Fehler bei der Überladungsauflösung, da keine zugreifbare "Subtract" mit diesen Argumenten aufgerufen werden kann: "Public Overloads Function Subtract(value As Date) As TimeSpan": Der Wert vom Typ "Date()" kann nicht in "Date" konvertiert werden. "Public Overloads Function Subtract(value As TimeSpan) As Date": Der Wert vom Typ "Date()" kann nicht in "TimeSpan" konvertiert werden. TestAPP C:\Users\Admin\source\repos\TestAPP\TestAPP\Form2.vb 49 Aktiv
    insgesamt habe ich 8 Fehlermeldungen die so ähnlich klingen.(Nur wenn ich (0L) verwende). Was bewirkt (0L)eigentlich ?
    Zu meiner eigentlichen Frage des Problems des Austricksen, ich habe da nach wie vor keine Idee wie ich weiter vorgehen kann bzw. einen Lösungsansatzes. Mir ist aufgefallen wenn ich ein new System.DateTime verwende,ist mein Code vollständig funktionsfähig aber in meinen Labels werden dann "Startzeit: 00:00:00" und "Endzeit: 00:00:30" ausgegeben. Ist das schonmal der Weg in Richtung "Nicht austricksbar"?
    Nutze ich wieder Now wird mir wie gestern z.B "Startzeit:13.01.2018 15:12:27"ausgegeben,ist aber austricksbar.

    Modul

    VB.NET-Quellcode

    1. Module Module1
    2. Public x As Integer = 0
    3. Public vntStartZeit As DateTime
    4. Public vntEndZeit As DateTime
    5. Public lngZeitDiff As TimeSpan
    6. Public timerstart As Boolean = False
    7. End Module

    Form2

    VB.NET-Quellcode

    1. Public Class Form2
    2. Dim tSpan As New TimeSpan(0, 0, 0, 30)
    3. Dim rest As TimeSpan
    4. Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    5. Label1.Text = "Startzeit" & vbCrLf & vntStartZeit
    6. Label2.Text = "Endzeit" & vbCrLf & vntEndZeit
    7. Label3.Text = "Restzeit" & vbCrLf & rest.Seconds & "Sec."
    8. Label4.Text = x & "X"
    9. If timerstart = True Then
    10. rest = vntEndZeit.Subtract(Now)
    11. If rest >= New TimeSpan(0, 0, 0, 0) Then
    12. ProgressBar1.Maximum = lngZeitDiff.Seconds
    13. ProgressBar1.Value = lngZeitDiff.Seconds - rest.Seconds
    14. 'Button1.Enabled = False
    15. Timer1.Enabled = True
    16. ElseIf rest <= New TimeSpan(0, 0, 0, 0) Then
    17. 'vntStartZeit = "00.00.0000 00:00:00"
    18. 'vntEndZeit = "00.00.0000 00:00:00"
    19. rest = New TimeSpan(0, 0, 0, 0)
    20. Label1.Text = "Startzeit" & vbCrLf & vntStartZeit
    21. Label2.Text = "Endzeit" & vbCrLf & vntEndZeit
    22. Label3.Text = "Restzeit" & vbCrLf & rest.Seconds & "Sec."
    23. x = x + 1
    24. Label4.Text = x & "X"
    25. Form1.Label1.Text = x & "X"
    26. timerstart = False
    27. Me.Show()
    28. MsgBox("Zeit abgelaufen", vbOKOnly, "Hinweis")
    29. End If
    30. End If
    31. End Sub
    32. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    33. timerstart = True
    34. vntStartZeit = Now
    35. 'vntStartZeit = New System.DateTime​ (umgeht das den trick?)
    36. vntEndZeit = Date.op_Addition(vntStartZeit, tSpan)
    37. lngZeitDiff = vntEndZeit.Subtract(vntStartZeit)
    38. rest = lngZeitDiff
    39. Label1.Text = "Startzeit" & vbCrLf & vntStartZeit
    40. Label2.Text = "Endzeit" & vbCrLf & vntEndZeit
    41. Label3.Text = "Restzeit" & vbCrLf & rest.Seconds & "Sec."
    42. Button1.Enabled = False
    43. ProgressBar1.Maximum = rest.Seconds
    44. Timer1.Enabled = True
    45. End Sub
    46. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    47. ProgressBar1.Increment(1)
    48. If rest <= New TimeSpan(0, 0, 0, 0) Then
    49. ' vntStartZeit = "00.00.0000 00:00:00"
    50. 'vntEndZeit = "00.00.0000 00:00:00"
    51. rest = New TimeSpan(0, 0, 0, 0)
    52. Label1.Text = "Startzeit" & vbCrLf & vntStartZeit
    53. Label2.Text = "Endzeit" & vbCrLf & vntEndZeit
    54. Label3.Text = "Restzeit" & vbCrLf & rest.Seconds & "Sec."
    55. x = x + 1
    56. Label4.Text = x & "X"
    57. Form1.Label1.Text = x & "X"
    58. timerstart = False
    59. Timer1.Enabled = False
    60. ProgressBar1.Value = ProgressBar1.Minimum
    61. timerstart = False
    62. MsgBox("Zeit abgelaufen", vbOKOnly, "Hinweis")
    63. Button1.Enabled = True
    64. Else
    65. rest = rest - New TimeSpan(0, 0, 0, 1)
    66. Label3.Text = "Restzeit" & vbCrLf & rest.Seconds & "Sec."
    67. End If
    68. End Sub
    69. End Class

    ​in Form 1 hatte ich keine Änderung vorgenommen und rufe meine Form2 nach wie vor mit Form2.Show()​ auf, vorerst) mit den richtigen Aufruf in .NET und mit den zurzeit noch als Kommentarmarkierten Stellen befasse ich mich heut Abend.

    Barohn schrieb:

    ich sollte ja

    VB.NET-Quellcode

    1. Public vntStartZeit As new DateTime(0L)
    verwenden.
    Musste aber das (0L) weglassen, da wenn ich dieses verwende immer Fehlermeldungen kommen.
    Kann eiglich nicht sein. Wenn zuvor Public vntStartZeit As Object = "00.00.0000 00:00:00" funktioniert hat, dann funktioniert jetzt auch Public vntStartZeit As new DateTime(0L). In dieser Zeile gibt das jdfs. keinen Fehler.
    Folglich redest du von anderen Fehlern.
    Kann man dir auch bei helfen, nur müsste man wissen, von welchen Fehlern genau: Fragen sinnvoll stellen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    :/ Hätt da durchaus intensiver gucken können. Hab heute herausgefunden das man mit Doppelklick ja zu den "fehlerhaften Stellen" gelangt. Nach etwas rumprobieren ist mir aufgefallen das die Variabel mit deinem Code nicht richtig difiniert wurde und habe meine Variable nun so defeniert:

    VB.NET-Quellcode

    1. Public vntStartZeit As DateTime = New DateTime(0L)

    abschließend habe ich nochmal meinen Code angepasst sodass jetzt wieder alles Funktioniert.

    VB.NET-Quellcode

    1. Public Class Form2
    2. Dim Zeit As Integer = 30
    3. Dim rest As Integer
    4. Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    5. Label1.Text = "Startzeit" & vbCrLf & vntStartZeit
    6. Label2.Text = "Endzeit" & vbCrLf & vntEndZeit
    7. Label3.Text = "Restzeit" & vbCrLf & rest & "Sec."
    8. Label4.Text = x & "X"
    9. If timerstart = True Then
    10. rest = vntEndZeit.Subtract(DateTime.Now).Minutes * 60 + vntEndZeit.Subtract(DateTime.Now).Seconds
    11. If rest >= 0 Then
    12. ProgressBar1.Maximum = lngZeitDiff.Minutes * 60 + lngZeitDiff.Seconds
    13. ProgressBar1.Value = lngZeitDiff.Minutes * 60 + lngZeitDiff.Seconds - rest
    14. Button1.Enabled = False
    15. Timer1.Enabled = True
    16. ElseIf rest <= 0 Then
    17. vntStartZeit = New DateTime(0L)
    18. vntEndZeit = New DateTime(0L)
    19. rest = 0
    20. Label1.Text = "Startzeit" & vbCrLf & vntStartZeit
    21. Label2.Text = "Endzeit" & vbCrLf & vntEndZeit
    22. Label3.Text = "Restzeit" & vbCrLf & rest & "Sec."
    23. x = x + 1
    24. Label4.Text = x & "X"
    25. Form1.Label1.Text = x & "X"
    26. timerstart = False
    27. Me.Show()
    28. MsgBox("Zeit abgelaufen", vbOKOnly, "Hinweis")
    29. End If
    30. End If
    31. End Sub
    32. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    33. timerstart = True
    34. vntStartZeit = Now
    35. 'bei new System.DateTime wert 0(umgeht das den trick)
    36. vntEndZeit = vntStartZeit.AddSeconds(Zeit)
    37. lngZeitDiff = vntEndZeit.Subtract(vntStartZeit)
    38. rest = lngZeitDiff.Minutes * 60 + lngZeitDiff.Seconds
    39. Label1.Text = "Startzeit" & vbCrLf & vntStartZeit
    40. Label2.Text = "Endzeit" & vbCrLf & vntEndZeit
    41. Label3.Text = "Restzeit" & vbCrLf & rest & "Sec."
    42. Button1.Enabled = False
    43. ProgressBar1.Maximum = rest
    44. Timer1.Enabled = True
    45. End Sub
    46. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    47. ProgressBar1.Increment(1)
    48. If rest <= 0 Then
    49. vntStartZeit = New DateTime(0L)
    50. vntEndZeit = New DateTime(0L)
    51. rest = 0
    52. Label1.Text = "Startzeit" & vbCrLf & vntStartZeit
    53. Label2.Text = "Endzeit" & vbCrLf & vntEndZeit
    54. Label3.Text = "Restzeit" & vbCrLf & rest & "Sec."
    55. x = x + 1
    56. Label4.Text = x & "X"
    57. Form1.Label1.Text = x & "X"
    58. timerstart = False
    59. Timer1.Enabled = False
    60. ProgressBar1.Value = ProgressBar1.Minimum
    61. timerstart = False
    62. MsgBox("Zeit abgelaufen", vbOKOnly, "Hinweis")
    63. Button1.Enabled = True
    64. Else
    65. rest = rest - 1
    66. Label3.Text = "Restzeit" & vbCrLf & rest & "Sec."
    67. End If
    68. End Sub
    69. End Class

    :P Zumindestens weiß ich jetzt was man alles im Datetime gespeichert haben kann und wie es ausgegeben wird :D
    Nun jedoch immernoch mein Problem das mein Timer halt austricksbar ist, indem ich einfach die Systemzeit ändere. Hast du da einen Lösungsansatz für mich den ich weiterverfolgen könnte um dieses Problem zu beheben?

    Barohn schrieb:

    :/ Hätt da durchaus intensiver gucken können. Hab heute herausgefunden das man mit Doppelklick ja zu den "fehlerhaften Stellen" gelangt. Nach etwas rumprobieren ist mir aufgefallen das die Variabel mit deinem Code nicht richtig difiniert wurde und habe meine Variable nun so defeniert:

    VB.NET-Quellcode

    1. Public vntStartZeit As DateTime = New DateTime(0L)
    Kann nicht sein. Deine Formulierung und meine Formulierung sind syntaktisch 100% äquivalent.
    Ich hühner da so drauf rum, weil du dabei bist, falsche Informationen in die Basis deines Grundlagen-Wissens einzubauen, und die bleiben da bis auf weiteres, was oft bedeutet: für immer.

    Wie lautet überhaupt die Fehlermeldung bei dir, wenn du so formulierst:

    VB.NET-Quellcode

    1. Public vntStartZeit As New DateTime(0L)
    ?
    Oh :/ bevor ich den Code nochmals geändert hatte habe ich die variable wie oben deklariert hab das grad wieder geändert ohne das = und es funktioniert jetzt doch :/ srry das ich das in Frage gestellt hatte. Den Hintergrund dazu versteh ich aber noch nicht so ganz wo mein eigentlicher Fehler lag.
    Brauch dir ühaupt nicht leid zu tun oder sowas. Passiert jedem (Erfahrungswert :) ), dass man über Fehler stolpert oder hängenbleibt, die garnet da sind, oder völlig unerklärlich auf einmal verschwunden sind. Genau bei sowas bringt einfach drüber reden oft den Ausweg, und dafür ists Forum ja da.

    Ach nochmal - wiederholt - der Tipp: Visual Studio - Empfohlene Einstellungen
    Nimm das ernst - inklusive das mit dem Abschalten des General-Deppen-Imports.
    Für vbCrLf ist dort auch eine überlegene Alternative genannt.
    :D ich denke mal war einfach ein Mischmasch aus den ganzen Informationen aus diversen Foren usw. weswegen ich anfangs bevor ich den Code angepasst hatte Fehler hatte.
    Nichts destotrotz wie kann ich es hinbekommen das man diesen Timer nicht austricksen kann in dem man die Systemzeit ändert. Wie kann ich die Zeit weiterlaufen lassen nach dem ich die Form schließe und neu Lade ohne eventuell die Systemzeit abrufen zu müssen bzw. das ganze so verpacken das ich im späteren verlauf die Variablen abspeichern kann um nach Beenden des Programmes beim Starten darauf zurückgegriffen werden kann und die Restzeit entsprechend neu berechnet werden kann (Stillschweigendes weiterlaufen der Zeit quasi). Kann mir da einer einen Lösungsansatz geben?

    Barohn schrieb:

    Nichts destotrotz wie kann ich es hinbekommen das man diesen Timer nicht austricksen kann in dem man die Systemzeit ändert.
    Hab ich mich noch nie mit beschäftigt - vlt. kann man die Systemzeit mit iwas aussm INet vergleichen.
    Bequemer ists (für mich) - erstmal nach dem Sinn von soner Veranstaltung zu fragen:
    1. Ein guter Hacker, ders will, wird dein Programm hacken - dagegen gibt es keinen endgültigen Schutz
    2. Du kannst allenfall beschließen, wie schwer du's ihm machen willst
    3. die wichtigste Frage: Glaubst du (im Ernst), dass dein Programm jemals das Interesse irgendeines Hackers erregen wird, dasser bereit ist, darin seine Zeit zu investieren?
    Die Interesse daran wird nie gegeben sein denk ich mir, mir geht es lediglich darum das man aktuell kein Hacker sein muss um den timer auszutricksen.
    Mein Ziel ist es lediglich den timer so zu konzipieren das er ohne das Internet die vorgegeben Zeit vollständig durchläuft.
    Aktuell ist es nämlich so, wenn ich den timer starte werden mir meine Zeiten definiert.
    Wenn ich anschließend die Form schließe, die normale Windows System Zeit um Betrag X in die Zukunft stelle (manuell) und anschließend die Form neu lade ist der timer natürlich um diesen Betrag X verkürzt.
    Daher meine Frage: ist mein Vorhaben überhaupt möglich, ist diese Bedingung auch gegeben wenn ich die ablikation komplett beende und z.B am nächsten Tag neu starte
    Wenn ja, wie kann ich sowas realisieren.
    Hab da in der Richtung schon was probiert, aber das Problem ist ja, das wenn ich das so mache läuft der timer auch nur während die Form geöffnet ist. Das heißt ich muss zuverlässig eine Differenz errechnen wie lange diese Form geschlossen blieb und dann damit rechnen. Vllt hab ich dazu eine Lösung die mir vorhin einviel, ansonsten muss ich doch noch einen weiteren timer implementieren der in jeder Form vorhanden ist und entsprechend alle timer Variablen (Differenzen) weiterzählt. Bzw immer die Werte übergeben.
    In meinen Hauptprogramm wollte ich wie oben programmierten timer mehrmals nutzen und dann wird es auch dazu kommen das mehrere am Stück aktiv sind.
    Wie verhält sich das eig auf die Performance? Ich habe die Variante wie oben genommen weil ich gelesen hätte man sollte zu viele zeitgleich laufende timer vermeiden. Oder hab ich da was falsch verstanden?
    Wenn es nun aber echt uncool ist timer laufenzulassen, bleibt mir halt nur die Möglichkeit das über das Internet abgleichen zu lassen. Im späteren wird eh eine SQL Datenbank mit im Spiel eingebunden sein. In der könnte ja dann die reelle Zeit zu jeder Zeit stehen.(sofern es nicht anders geht) , oder bin ich da zu blauäugig optimistisch?
    *Thema Rauskramen
    Moin Moin,

    Srry für die späte Antwort @Kameo aber ich denke nicht, hatte auch einiges Probiert. Das Problem ist wenn ich Quasi mein Objekt (hoffe mal das ich das OOP richtig verstanden habe, dazu nochmal eine Frage später) neu erzeuge, bräuchte ich eine Referenz Zeit wie lange es nicht vorhanden war. Das kann ich mir ja nur über Datetime.Now holen, wenn ich mich nicht Irre. Ich denke ich muss darauf zurückgreifen früher oder später diese Referenzzeit aus dem Internet zu holen bzw. im späteren Verlauf wird es eh eine Datenbank geben. Vielleicht hab ich auch nur ein Brett vorm Kopf mir das alles mit der einmaligen Zuweisung einer aktuellen Zeit zu errechnen.

    @ErfinderDesRades Du hattest ja OOP erwähnt, ich habe mich in den letzten Tagen unteranderem mit dem Thema viel befasst und bin mir nicht sicher ob ich es so Richtig verstanden habe. Im nachfolgenden wäre jetzt zu meinem ersten Code eine Abwandlung (auch statt einer neuen Form nutze ich jetzt ein Usercontrol) die meine Auffassung von OOP Wiederspiegelt. Damit ich jetzt nicht völlig falsch weitermache wäre ein Feedback mit evntuellen Verbesserung/Streichungen o.Ä. sehr nett.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Variablen 'Leere Klasse
    2. Public Shared Sub Increase_Resources(ByVal typ As String, value As Integer, EndZeit As DateTime, timer As Boolean)
    3. If typ = Typ_Holz Then
    4. Holz_Anzahl = value
    5. Holz_Endzeit = EndZeit
    6. Holz_timer = timer
    7. ElseIf typ = Typ_Stein Then
    8. stein = value
    9. Stein_Endzeit = EndZeit
    10. Stein_timer = timer
    11. ' Weitere resourcen = neues ElseIF?
    12. End If
    13. End Sub
    14. 'Holz
    15. Public Shared Typ_Holz As String = "Holz"
    16. Public Shared Holz_Anzahl As Integer
    17. Public Shared Holz_Endzeit As New DateTime(0L)
    18. Public Shared Holz_timer As Boolean = False
    19. 'Stein
    20. Public Shared Typ_Stein As String = "Stein"
    21. Public Shared stein As Integer
    22. Public Shared Stein_Endzeit As New DateTime(0L)
    23. Public Shared Stein_timer As Boolean
    24. End Class
    25. 'Neue Windows Form
    26. Imports OOP.Variablen
    27. Public Class Haubtmap
    28. Private Sub Haubtmap_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    29. Label1.Text = "Stein:" & stein & Tab & "Holz:" & Holz_Anzahl
    30. End Sub
    31. Private Sub Holzfällerhütte_Open_Click(sender As Object, e As EventArgs) Handles Holzfällerhütte_Open.Click
    32. Dim holzhütte As New Produktionsstätte("Holzfällerhütte", Typ_Holz, Holz_Anzahl, Holz_Endzeit, Holz_timer)
    33. Me.Controls.Add(holzhütte)
    34. holzhütte.BackColor = Color.Green
    35. End Sub
    36. Private Sub Steinmetz_Open_Click(sender As Object, e As EventArgs) Handles Steinmetz_Open.Click
    37. Dim steinmetz As New Produktionsstätte("Steinmetz", Typ_Stein, stein, Stein_Endzeit, Stein_timer)
    38. Me.Controls.Add(steinmetz)
    39. steinmetz.Location = New Point(0, 205)
    40. End Sub
    41. Public Sub aktuallisieren()
    42. Label1.Text = "Stein:" & stein & Tab & "Holz:" & Holz_Anzahl
    43. End Sub
    44. End Class
    45. Public Class Produktionsstätte 'Mein Userkontroll
    46. Dim Produktions_name As String
    47. Dim Produktions_typ As String
    48. Dim vntStartZeit As DateTime
    49. Dim vntEndzeit As DateTime
    50. Dim lngZeitDiff As TimeSpan
    51. Dim timer_run As Boolean
    52. Dim zeit As Integer = 30
    53. Dim Produktionsgut As Integer
    54. 'Methode Produktion--------------------------------------------------
    55. Private Sub Produktion(ByVal timer As Boolean, Lager_endzeit As DateTime, Zeit As Integer)
    56. If timer = True Then
    57. lngZeitDiff = Lager_endzeit.Subtract(DateTime.Now)
    58. If lngZeitDiff >= New TimeSpan(0, 0, 0, 0) Then
    59. Produktion_Progress.Maximum = Zeit
    60. Produktion_Progress.Value = Zeit - CInt(lngZeitDiff.TotalSeconds)
    61. Produktionszeit_label.Text = "Startzeit:" & NewLine & vntStartZeit & NewLine & "Endzeit:" & NewLine & vntEndzeit & NewLine & "Restzeit:" & lngZeitDiff.ToString
    62. Produktion_Start_Button.Enabled = False
    63. Produktion_timer.Enabled = True
    64. Else
    65. Produktion_Ende()
    66. End If
    67. Else
    68. vntStartZeit = DateTime.Now 'nicht zwingend notwendeig/gleich hinter die endtime
    69. vntEndzeit = vntStartZeit.AddSeconds(Zeit)
    70. lngZeitDiff = vntEndzeit.Subtract(vntStartZeit)
    71. Produktion_Progress.Maximum = Zeit
    72. Produktionszeit_label.Text = "Startzeit:" & NewLine & vntStartZeit & NewLine & "Endzeit:" & NewLine & vntEndzeit & NewLine & "Restzeit:" & lngZeitDiff.ToString
    73. Produktion_Start_Button.Enabled = False
    74. Produktion_timer.Enabled = True
    75. timer_run = True
    76. Variablen.Increase_Resources(Produktions_typ, Produktionsgut, vntEndzeit, timer_run)
    77. End If
    78. End Sub
    79. Private Sub Produktion_Ende() '<---- Funktion oder Sub?
    80. vntEndzeit = New DateTime(0L)
    81. vntEndzeit = New DateTime(0L)
    82. lngZeitDiff = New TimeSpan(0, 0, 0, 0)
    83. Produktion_Progress.Value = Produktion_Progress.Minimum
    84. Produktionszeit_label.Text = "Startzeit:" & NewLine & vntStartZeit & NewLine & "Endzeit:" & NewLine & vntEndzeit & NewLine & "Restzeit:" & lngZeitDiff.ToString
    85. Produktionsgut += 1
    86. typ_lager_label.Text = Produktions_typ & ":" & Produktionsgut
    87. timer_run = False
    88. Produktion_timer.Enabled = False
    89. Produktion_Start_Button.Enabled = True
    90. Variablen.Increase_Resources(Produktions_typ, Produktionsgut, vntEndzeit, timer_run)
    91. Haubtmap.aktuallisieren()
    92. MessageBox.Show("Zeit abgelaufen" & NewLine & "Es wurde 1 " & Produktions_typ & " zum Lager hinzugefügt", "Hinweis")
    93. End Sub
    94. 'Konstruktor --------------------------------------
    95. Sub New(ByVal name As String, Typ As String, Lager As Integer, Lager_endzeit As DateTime, timer As Boolean)
    96. ' Dieser Aufruf ist für den Designer erforderlich.
    97. InitializeComponent()
    98. Produktions_name = name
    99. Produktions_typ = Typ
    100. Produktionsgut = Lager
    101. vntEndzeit = Lager_endzeit
    102. timer_run = timer
    103. End Sub
    104. 'Der rest----------------------------------
    105. Private Sub Produktionsstätte_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    106. If timer_run = True Then
    107. Produktionsname_label.Text = Produktions_name
    108. typ_lager_label.Text = Produktions_typ & ":" & Produktionsgut
    109. Produktion(timer_run, vntEndzeit, zeit)
    110. Else
    111. Produktionsname_label.Text = Produktions_name
    112. typ_lager_label.Text = Produktions_typ & ":" & Produktionsgut
    113. Produktionszeit_label.Text = "Startzeit:" & NewLine & vntStartZeit & NewLine & "Endzeit:" & NewLine & vntEndzeit & NewLine & "Restzeit:" & lngZeitDiff.ToString
    114. End If
    115. End Sub
    116. Private Sub Produktion_Start_Click(sender As Object, e As EventArgs) Handles Produktion_Start_Button.Click
    117. Produktion(timer_run, vntEndzeit, zeit)
    118. End Sub
    119. Private Sub Produktion_timer_Tick(sender As Object, e As EventArgs) Handles Produktion_timer.Tick
    120. Produktion_Progress.Increment(1)
    121. If lngZeitDiff >= New TimeSpan(0, 0, 0, 1) Then
    122. lngZeitDiff -= New TimeSpan(0, 0, 0, 1)
    123. Produktionszeit_label.Text = "Startzeit:" & NewLine & vntStartZeit & NewLine & "Endzeit:" & NewLine & vntEndzeit & NewLine & "Restzeit:" & lngZeitDiff.ToString
    124. Else
    125. Produktion_Ende()
    126. End If
    127. End Sub
    128. Private Sub Produktion_schließen_Click(sender As Object, e As EventArgs) Handles Produktion_schließen.Click
    129. Me.Dispose()
    130. End Sub
    131. End Class


    ​P.S. einige Notizen an den Codes waren für mich Anmerkungen

    Barohn schrieb:

    Datetime.Now
    oder ne StopWatch. Die ist dafür wohl besser geeignet.
    msdn.microsoft.com/de-de/libra….stopwatch(v=vs.110).aspx
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!