Thread Speichern,Laden und fortsetzen

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

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

    Thread Speichern,Laden und fortsetzen

    Hallo,
    hab ein Problem mit Threading dachte vieleich könnt ihr mir helfen und zwar hab ich ein Programm das Primzahlen berechnet, die aber zu ende zu rechnen dauert Monate.
    Mein Problem ist das ich nicht meinen Computer Monate lang laufen lassen will.

    Die berechnungen laufen in verschiedenen Threads, die Threads kann ich mit Thread.Suspend und Thread.Resume zwar pausieren und fortsetzen aber nur solange das Programm nicht beendet wurde oder der Computer nicht neugestartet wird.

    Gibt es eine Möglichkeit die Threads dauerhaft zu speichern?
    Danke!
    Brauch ich für ein Benchmarkprogramm was in Kombination mit pi Berechnungen die Zeit misst die Cpu oder Gpu benötigt um anzahlen von bytes in einem algorythmus zu berechnen.
    Z.B. 256KB=20.001Sec. CpuTime
    512KB=40.002Sec. CpuTime u.s.w
    Einfachst-Beispiel / meine simple Lösungsidee:

    VB.NET-Quellcode

    1. Dim suspend As Boolean
    2. Dim abort As Boolean
    3. Dim lastState As Int32
    4. Dim lastStateValid As Boolean
    5. Sub ThreadProc()
    6. Dim i As Int32
    7. If lastStateValid Then
    8. i = lastState
    9. End If
    10. While Not (suspend Or abort)
    11. i += 1 'Do Work
    12. End While
    13. If suspend Then
    14. lastState = i
    15. End If
    16. End Sub
    17. Sub StartNew()
    18. lastStateValid = False
    19. Thread.Start(Nothing)
    20. End Sub
    21. Sub Abort()
    22. abort = True
    23. End Sub
    24. Sub Suspend()
    25. suspend = True
    26. 'Save lastState to disk
    27. End Sub
    28. Sub Resume()
    29. 'Load lastState from disk
    30. lastStateValid = True
    31. Thread.Start(New Object)
    32. End Sub

    Synchronisierung nicht vergessen.
    Gruß
    hal2000
    Deinen Beispiel Code verstehe ich nicht ganz, die Berechnungen im fall von Suspend() in lastState auf disk zu speichern ist kein Problem.
    Bei Resume() aber läst sich aber kein Thread starten.
    Die gespeicherten letzten Werte sind zwar da der Thread kennt aber seine Ziel nicht und kann die Aufgabe nicht zu ende rechnen.
    Die gespeicherten Werte sind also nur Werte.
    Eine Formel zu programieren geht nicht, dafür muss ich ja alles selber Zählen und die Werte überprüfen da kann ich ja gleich selber alles aufschreiben(Wozu dafür einen Rechencomputer :D ).

    Gibt es vieleicht eine Möglichkeit Thread.Suspend() dauerhaft zu speichern und nicht nur im Arbeitsspeicher?
    Die Informationen für Thread.Resume() sind ja auf jeden fall im Arbeitsspeicher vorhanden.
    Könnte man also irgendwie auf Festplatte speichern und fortsetzen oder nicht?
    In der Thread-Prozedur berechnest du was. Also hast du auch einen aktuellen Zustand, aus dem das nächste Ergebnis (nach einer weiteren beliebig komplizierten Rechenoperation) resultiert (bei mir ist der Zustand nur i und die Operation +1). Du kannst also den aktuellen Vorgang abbrechen, musst dabei aber den Zustand speichern, wenn du ihn nicht verlieren willst. Danach kann der Thread ganz normal enden.

    Soll die Berechnung fortgesetzt werden, musst du den Zustand manuell wiederherstellen (ich muss z.B. i auf den letzten bekannten Wert setzen). Danach starte ich den Thread neu, als ob die Berechnung von vorne beginnt. Da ich aber vorher den alten Zustand geladen habe, geht die Berechnung von dort aus weiter.

    BruceLee schrieb:

    Die gespeicherten letzten Werte sind zwar da der Thread kennt aber seine Ziel nicht und kann die Aufgabe nicht zu ende rechnen.

    Dann hast du mindestens einen Wert vergessen. Computer sind deterministisch, d.h. solange kein Fehler auftritt, kann das Programm aus einem beliebigen gültigen Zustand mit der Berechnung fortfahren. Der Ruhezustand von Windows ist ein Beispiel dafür - egal welche und wie viele Programme gestartet sind --> Ruhezustand funktioniert unabhängig davon.
    Gruß
    hal2000
    OK das Computer aus jedem beliebigen gültigen Zustand mit Berechnungen fortfahren können hab ich verstanden.

    Ich erklär mein Problem mal etwas anders.

    Dim i as int32()
    Bei suspend oder abort kommen meine Berechnungen.
    In Variable i wird beim abbruch der Zustand gespeichert.

    Jetzt will ich einen neuen Thread mit dem gespeicherten Zustand starten.
    Das problem ist aber das Variable i kein Sub ist also keine addresse.
    Wie soll ich den neuen Thread jetzt Starten?
    Bei mir geht das nicht wie in deinem Code in Zeile 39 beschrieben.
    hmm bei einer schleife kannst du doch beim Abbrechen den aktuellen Wert von I merken.
    Bei der Wiederaufnahme, eine Variable setzen.
    Etwa in der Art:

    Quellcode

    1. ' das wäre der Start eines Threades
    2. Dim Startwert as integer =0 ' der normale I-Startwert Wert, wenn nicht resume ist
    3. if Wiederaufname=true then
    4. Startwert= Alter_I_Wert
    5. Wiederaufnahme=false
    6. end if
    7. for I=Startwert to 1000000
    8. machwas
    9. next

    Das geht nur bei einfachen Berechnungen :D
    Schon bei Permutation von zwei Buchstaben würde dir so wie du das geschrieben hast eine ganze menge an Berechnungen fehlen :D
    Bei Berechnungen wo nur hoch und runter gezählt wird geht das,stimmt.

    Edit by hal2000:
    - Vollzitat entfernt.

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

    Du musst deinen Algorithmus natürlich entsprechend designen. Für dein genanntes Beispiel reicht es vermutlich, die aktuelle Permutation zu speichern. Du beginnst dann eben nicht bei "ABCDE" (also am Anfang), sondern bei irgendeinem Zwischenwert. Der Algorithmus, der permutiert, kann das auch mit einem anderen Startwert.

    Der Trick ist, dass du den Algorithmus A an einem definierten Punkt unterbrichst. An dieser Stelle speicherst du und lässt den berechnenden Thread enden. Irgendwann später startest du einen neuen Thread, aber bevor du mit der Arbeit beginnst, setzt du schnell noch den Zustand zurück. Daduch tust du so, als ob der alte Thread gerade an dem oben definierten Punkt wäre und jetzt weiterrechnet. Dass es in Wirklichkeit ein neuer Thread ist interessiert ja keinen.
    Gruß
    hal2000

    BruceLee schrieb:

    eine ganze menge an Berechnungen fehlen
    @hal2000 Jou.
    @BruceLee Mach Dir eine entsprechende serialisierbare Klasse, speichere sie bei ende, lade sie bei Start und mach einfach weiter. :thumbsup:
    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!