Prozess an bestimmten Wochentag ausführen

  • VB.NET

Es gibt 23 Antworten in diesem Thema. Der letzte Beitrag () ist von schnibli.

    Prozess an bestimmten Wochentag ausführen

    Hallo,

    Ich würde gerne in meinem Programm (Backup-Programm von externer HD) einen Prozess an einem bestimmten Wochentag ausführen.
    Z.b. das er mir den Sub bck_dokumente jeden Freitag um 16:00 ausführt.

    Ich hatte schon die Idee den Wochentag in ein Label einzulesen und anschlissend mit meinem "Wunschtag" zu vergleichen, aber ich denke es gibt hier eine "bessere" Lösung.

    Freundliche Grüsse

    Schnibli
    Hab eine Lib gebastelt welche das vereinfacht:
    In meiner Signatur kannste diese downloaden.

    Dein Code wäre jetzt mal so hingeklatscht (mit dieser Lib)

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports ScheduleLib.Scheduler
    3. Public Class Form1
    4. Private WithEvents _Scheduler As ScheduleLib.Scheduler
    5. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    6. Dim dtNextDate As Date = Date.Parse(Date.Now.ToShortDateString & " 16:00:00")
    7. Do Until dtNextDate.DayOfWeek = DayOfWeek.Friday
    8. dtNextDate = dtNextDate.AddDays(1)
    9. Loop
    10. _Scheduler = New ScheduleLib.Scheduler(dtNextDate)
    11. End Sub
    12. Private Sub Tick() Handles _Scheduler.Tick
    13. 'do something on friday
    14. End Sub
    15. End Class


    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    Du legst dein Programm in den Autostart und versteckst das Programm direkt nach dem Start, indem du folgenden Code in das "Shown"-Event der Form schreibst:

    VB.NET-Quellcode

    1. Me.Hide()


    Außerdem fügst du der Startform einen Timer hinzu, dessen "Enabled"-Eigenschaft du auf "True" setzt. Füge nun folgenden Code für das Timer-Ereignis ein, (wobei die orangene 1 für den Wochentag Montag steht usw...):

    VB.NET-Quellcode

    1. If Now.DayOfWeek = 1 Then
    2. 'Dein Backup starten
    3. 'Dein Code
    4. 'Überprüfung beenden
    5. Timer1.Stop()
    6. End If

    Den Timer-"Intervall" setzt du z.B. auf 3600000 (1min) --> Je nach dem, in welchen Abständen das Programm überprüfen soll, ob der jeweilige Wochentag erreicht ist.

    Allerdings ist die Lösung, wie schon gesagt wurde, nicht gerade glücklich, weil das Programm die ganze Zeit über läuft.
    Danke für die Zahlreichen Antworten, das mit der Lib klingt ganz gut.

    Taskplaner ist nicht sinvoll für das was ich machen möchte. aber danke

    Nachtrag:
    JoRu1407, genau das was ich gesucht habe, perfekt!!!
    Der Unterschied zu der Lib und einem Timer ist, dass der Timer mit Intervall 360000 sehr ungenau ist (bis zu 59,59 Sekunden)
    Stellst du den Intervall zu niedrig ist das für die Performance nicht gut und unsauber (du schaust auch nicht alle Sekunden zur Mikrowelle ob das Essen schon fertig ist, sondern gehst hin wenns piept)

    Also warum nicht einfach ein Event genau 1x feuern lassen, welches genau an diesen Zeitpunkt (+/- paar Millisekunden) das ausführt was man will?

    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    Dan werde ich wohl die 5 Instanzen erstellen und es ausprobieren.

    Ich hab leider noch ein Problem, ohne dies zu lösen nützt mir dein Beitrag nur die hälfte, hast du mal zeit reinzuschauen? :)

    HTML-Quellcode

    1. http://www.vb-paradise.de/programmieren/internet-und-netzwerkprogrammierung/79422-listbox-als-txt-mit-e-mail-versenden/



    edit:

    Kann es sein das mit deiner lib das Programm ca.10sek länger hat bis es öffnet?

    Hatt sich erledig, nur im debug :)

    Werde mich morgen mal daran setzen zu verschiedenen Zeiten verschiedene Events auszuführen...


    Nachtrag:

    Hallo fichz.

    Ich bin ein bisschen überfordert mit dem Hinzufügen der 5 verschiedenen Prozesse an 5 verschiedenen Wochentagen (bez. Zeiten)

    könntest du mir bitte ein Beispiel mit einer 2 "instanz" zeigen?

    Danke

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

    mit today.dayofweek wird der Wochentag ermittelt (0 = Sonntag, 1 = Montag, 2 = Dienstag usw
    mit formatdate(now,shorttime) läßt sich die Uhrzeit im Format hh.min darstellen
    if now.dayofweek = 3 then
    msgbox("Heute ist Mittwoch")
    Mich würde interessieren, wieso du den Taskplaner von Windows für unpassend hälst? Ich habe selbst ein Backup-Programm nach dem rsync-Prinzip geschrieben und steuere den Start per Taskplaner. Auch falls das Backup z.B. durch Herunterfahren unterbrochen wird, macht er beim nächsten Anmelden weiter dank vorher erstelltem Task.
    Die App soll installiert werden sollen, und alles soll funktionieren, es ist frei wählbar welche HD am welchen Tag um welche Zeit ge-backupt werden soll.
    E-mail Benachrichtigungen:
    Bei erfolgreichem Backup (Name, dauer, Transferierte MB's
    Bei abbruch
    Bei fehler (inkl. logdatei)
    Bei Voller Backup "Server"
    Bei Zu-hoher Prozessor Temparatur
    Bei Ram mehr als XX°C

    Natürlich 1001 einstellung, die ganze Anwendung kann nach lust und laune Programiert werden.


    Dazu kommt das ich gerne Sachen lerne (rund ums Programmieren)


    ____

    Hallo
    klavierduo

    Ist nicht das was ich gesucht habe, da es nicht Funktioniert.


    Gruss
    Zu deinem Nachtrag (gerade gesehen) mit den 5 Instanzen.
    Mach dir einfach nur 1 Instanz.

    Diese Klasse hat die Methode "ChangeDate" womit du der Instanz ein neues Datum eintragen kannst.
    Diese Methode kannst du zB im Tick Event ausführen (am Ende) um den nächsten Zeitplan festzulegen.

    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    Ja, ich habe 5 verschiedene Verzeichnisse die an 5 verschiedenen Tage um 5 verschiedene Zeiten gemacht werden.

    Die Zeit neu zu setzen ist kein Problem das habe ich geschafft.

    Probleme habe ich wenn ich einen Neuen Tag setzen will,

    VB.NET-Quellcode

    1. If txt_serv_min.Text = "" Then
    2. Else Dim dtNextDate As Date = Date.Parse(Date.Now.ToShortDateString & " " & txt_serv_h.Text & ":" & txt_serv_min.Text & ":" & txt_serv_sec.Text)
    3. Do Until dtNextDate.DayOfWeek = DayOfWeek.Wednesday
    4. dtNextDate = dtNextDate.AddDays(1) Loop _Scheduler = New ScheduleLib.Scheduler(dtNextDate) End If



    Ich würde gerne statt dies:

    VB.NET-Quellcode

    1. DayOfWeek.Wednesday


    dies:

    VB.NET-Quellcode

    1. DayOfWeek.Combobox1.text



    Und in der Combobox sind dan die Tage aufgelistet
    -Monday
    -Tuesday
    etc.


    Das zweite ist, wenn ich den Tag und die Zeit neu setze,
    müsste ich ja im "Sub Tick" eine if them else abfrage generieren die mir heraussucht welches Backup an welchem Tag gemacht werdem muss.

    Hab ich es jetzt verständlich formuliert? :)
    Ich hab in diesem Thread nicht alles gelesen.
    Mir scheint, Du hast einen suboptimalen Plan.
    Mach Die eine Tabelle (am besten XML-Format) in einem DataGridView mit den erforderlichen Einträgen:
    Wochentag Uhrzeit Tätigkeit Property1 Property2 Property3 NextWeek
    Montag 12:00 Backup1 Source1 Dest1 ... 29
    Montag 13:00 Backup2 Source2 Dest2 ... 29
    Dienstag 11:00 SpeedDisk D: .... .... 30
    usw.
    In der Spalte NextWeek steht die lfd. Kalenderwoche, in der das wieder zu tun ist, da hast Du gleich die Kontrolle, ob es in dieser Woche bereits erledigt ist, nach dem Antriggern musst Du dann diesen Eintrag hochzählen, da kannst Du Dir gleich noch eine Spalte Step anlegen, also jede Woche, jede 2. Woche usw.
    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!
    Hier ein Beispiel gelöst mit einer Dictonary

    VB.NET-Quellcode

    1. Private _dictDays As New Dictionary(Of Integer, DayOfWeek)
    2. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    3. ComboBox1.Items.Clear()
    4. For i As Integer = 0 To [Enum].GetNames(GetType(DayOfWeek)).Count() - 1
    5. ComboBox1.Items.Add([Enum].GetValues(GetType(DayOfWeek)).GetValue(i))
    6. _dictDays.Add(ComboBox1.Items.Count - 1, [Enum].GetValues(GetType(DayOfWeek)).GetValue(i))
    7. Next
    8. ComboBox1.SelectedIndex = 0
    9. End Sub
    10. ' Überprüfen
    11. Do Until dtNextDate.DayOfWeek = _dictDays(ComboBox1.SelectedIndex)
    12. dtNextDate = dtNextDate.AddDays(1)
    13. Loop


    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten