Label.Update() funktioniert nicht richtig

  • VB.NET

Es gibt 29 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    Label.Update() funktioniert nicht richtig

    Hi,

    ich habe hier ein Problem mit der dynamisch wechselnden Anzeige eines Labels. Der Hintergrund:

    Mein Prozess läuft sehr lange (mehrere Minuten) und ich würde dem Anwender gern anzeigen, in welchem Abschnitt sich die Arbeiten gerade befinden.

    Dazu habe ich ein Label, nennen wir es lblMessage

    In dieses Label schreibe ich den gerade aktuellen Status hinein. Und weil die Anzeige standardmäßig erst am Ende der Prozedur neu geladen wird, führe ich die Funktion .Update() aus.

    VB.NET-Quellcode

    1. lblMessage.Text = "Process ALL started FromDrive=" & strFromDrive & ": ToDrive=" & strToDrive & ": "
    2. lblMessage.Update()


    So weit so gut. Das Ergbnis seht ihr im Anhang (msg 01.jpg)

    Danach ändere ich den Status:

    VB.NET-Quellcode

    1. lblMessage.Text = "Save disk SerialNumber ..."
    2. lblMessage.Update()


    Das Ergebnis seht ihr im Anhang (msg 02.jpg)

    Die zweite Meldung ist KÜRZER als die erste Meldung ... und blöderweise bleibt der Rest der ersten Meldung sichtbar !

    Ich habe ein .Refresh auf das Label versucht ... ich habe auf den übergeordneten GroupContainer ein .Update() ausgeführt ...

    VB.NET-Quellcode

    1. lblMessage.Refresh() '***TEST***
    2. grpSelect.Update() '***TEST***
    3. grpSelect.Refresh() '***TEST***


    Egal was ich mache ... der Rest der ersten Meldung bleibt sichtbar.

    Aber offentlich muss es möglich sein, das zu beheben. Ich habe meine Prozedur weiter getraced ... und irgendwann verschwindet der Rest ... und zwar in folgender Anweisung:

    VB.NET-Quellcode

    1. Dim Disk As System.Management.ManagementObject = New System.Management.ManagementObject(win32Drive)


    Nach dieser Anweisung ist alles paletti ! (s. Anhang msg 03.jpg)

    Ich bin ratlos ! Möglichweise ist mir hier (ein ums andere mal) wieder etwas ganz Triviales entgangen. Aber ich bin mir sicher, dass ihr mir mit der gewohnten Nachsichtigkeit und Freundlichkeit auf die Sprünge helfen könnt.

    LG
    Peter


    P.S.: Bitte schlagt mir jetzt nicht vor, dass ich einfach nach jeder Änderung des Labels einfach die "Dim Disk = New ... " Anweisung ausführen solll ... Auf solche Ideen komme ich nämlich von alleine ... :)

    LG
    d.O.
    Bilder
    • msg 03.jpg

      22,64 kB, 936×138, 91 mal angesehen
    • msg 02.jpg

      23,77 kB, 936×138, 85 mal angesehen
    • msg 01.jpg

      23,82 kB, 936×138, 89 mal angesehen

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

    Der lange Prozess läuft vermutlich im Mainthread(=Gui-Thread). Solange er läuft, kann das Gui nix tun.
    Üblicherweise verlegt man solche Prozesse dann mittels Async/Await in einen NebenThread.
    Meldungen aus dem nun nebenläufigen Prozess müssen threadübergreifend abgesetzt werden - dazu gibts eine Progress(Of T)-Klasse.
    Ausserdem brauchst du nun einen IsBusy-Dialog, der deine Anwendung für den User blockiert - damit er nicht iwelche Buttons drückt und weiss Gott was auslöst - während der Prozess noch garnet durch ist.
    Im winForms-Tut-Bereich habich ein IsBusy-Dialog eingestellt. Der kann aber noch nicht threadübergreifende Meldungen anzeigen.
    threadübergreifende Meldungen anzeigen habich gemacht bei meine Übungen mit SplashScreen (muss da auch iwie rumfahren).
    @Peter329 Mach mal das Label im Designer .AutoSize = False und ziehe es so groß, dass der längste Text sicher reinpasst.
    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!
    Vielen Dank erst mal für eure Ratschläge ...

    Der Vorschlag von EDR klingt sehr professionell ... aber er klingt auch nach sehr viel Arbeit ... :)

    Der Vorschlag von RFG ist da sehr viel handlicher ... und er funktioniert ! Also das hab ich jetzt so umgesetzt.

    Nun hätte ich natürlich gern noch etwas:

    In dem Feld secs werden die Sekunden angezeigt, die seit dem Start verstrichen sind. Bisher habe ich das Feld am Ende jeder Prozedur aktualisiert. Aber manche Prozeduren brauchen recht lang ... und da wäre es besser, wenn der Sekundenzähler "laufen" würde ....

    Ich hab das mit einem Timer wie folgt versucht:

    VB.NET-Quellcode

    1. Dim myProcessTS As DateTime = Nothing
    2. Private Sub StartProcessTimer()
    3. myProcessTS = Nothing
    4. txtElapsed.Text = "0"
    5. txtElapsed.Update()
    6. myProcessTS = DateTime.Now
    7. ProcessTimer.Enabled = True
    8. End Sub
    9. Private Sub StopProcesstimer()
    10. ProcessTimer.Enabled = False
    11. myProcessTS = Nothing
    12. End Sub
    13. Private Sub ProcessTimer_Tick(sender As Object, e As EventArgs) Handles ProcessTimer.Tick
    14. txtElapsed.Text = Elapsed(myProcessTS)
    15. txtElapsed.Update()
    16. End Sub


    Sieht hübsch aus, funktioniert aber leider nicht ! :(

    Der Timer wird wohl nicht aktualisiert, während die Prozedur läuft - ich kriege nach wie vor nur die Sekunden am ENDE der Prozedur angezeigt.

    Async ist leider auch nicht möglich:

    VB.NET-Quellcode

    1. Private Async Sub ProcessTimer_Tick(sender As Object, e As EventArgs) Handles ProcessTimer.Tick
    2. txtElapsed.Text = Elapsed(myProcessTS)
    3. txtElapsed.Update()
    4. End Sub


    "This async methods lacks "Await" operators and so it will run synchronously ..."

    Wie kriegt man das denn hin, dass so ein Sekundenzähler läuft ...

    LG
    Peter

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Peter329“ ()

    @Peter329 Da musst Du Dir einen Threading.Timer nehmen, der läuft in einem anderen Thread, deshalb musst Du dann die GUI-Ausgabe invoken.
    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!
    Also das hab ich mal in Angriff genommen:

    VB.NET-Quellcode

    1. Dim TheTimer As System.Threading.Timer
    2. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. 'Tick : the callback method the timer should invoke
    4. 'nothing: an object to pass into the callback method
    5. '0 : the amount of time the timer should wait before its first call to the callback
    6. '1000 : the number of milliseconds between calls to the callback routine
    7. myProcessTS = DateTime.Now
    8. Debug.Print("Threading timer started ...")
    9. TheTimer = New System.Threading.Timer(AddressOf Tick, Nothing, 0, 1000)
    10. End Sub
    11. Public Sub Tick(info As Object)
    12. Debug.Print(DateTime.Now.ToString("HH:mm:ss"))
    13. UpdateSecs()
    14. End Sub
    15. Private Sub UpdateSecs()
    16. txtElapsed.Text = Elapsed(myProcessTS)
    17. txtElapsed.Update()
    18. End Sub
    19. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    20. If TheTimer IsNot Nothing Then
    21. TheTimer.Dispose()
    22. Debug.Print("Threading timer stopped.")
    23. End If
    24. End Sub


    Der Timer läuft prima ... und er lässt sich auch wieder anhalten. Das ist ja schon mal gut.

    Allerding klappt die Sache mit dem Aufruf von UpdateSecs() nicht ... ich erhalte eine Exception, weil der Treading Timer außerhalb des Basis Treads läuft. Das hast du mir ja auch schon angedroht ! :)

    Deine etwas kryptische Anweisung, die GUI Ausgabe zu "invoken" habe ich aber nicht nachvollziehen können, weil mein Sample in C# geschrieben ist:

    C#-Quellcode

    1. // The timer ticked.
    2. public void Tick(object info)
    3. {
    4. this.Invoke((Action)this.UpdateCountdown);
    5. }


    Kann mir jemand sagen, wie das im VB kodiert werden muss ?

    LG
    Peter

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

    @Peter329 Aus einem SerialPort-Projekt:

    VB.NET-Quellcode

    1. Private Sub SerialPort1_DataReceived(sender As Object, e As IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    2. Dim txt = SerialPort1.ReadExisting()
    3. Me.Invoke(Sub() Me.Label1.Text = txt)
    4. 'InvokeLabelTextChange(txt)
    5. End Sub
    6. Private Sub InvokeLabelTextChange(txt As String)
    7. If (Me.InvokeRequired) Then
    8. ' ruft sich selbst auf
    9. Me.Invoke(New Action(Of String)(AddressOf InvokeLabelTextChange), txt)
    10. Return
    11. End If
    12. Me.Label1.Text = txt
    13. End Sub
    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!
    dieses sich selbst invoken ist eine UnArt.
    Der Timer tickt im NebenThread, dann kann er die ZielMethode invoken - die braucht sich nicht selbstInvoken.

    VB.NET-Quellcode

    1. Public Sub Tick(info As Object)
    2. Debug.Print(DateTime.Now.ToString("HH:mm:ss"))
    3. Me.BeginInvoke(New Action()(AddressOf UpdateSecs))
    4. End Sub

    fennich.
    Tatsächlich kann UpdateSecs durch eine anonyme Methode ersetzt werden, und was Elapsed() macht ist mir auch unklar - ich fürchte, kann auch weg.

    Ah - ich sehe, du rufst den Selbst-Invoker ja auch garnicht auf, sondern frühstückst es auch mit einer anon-Methode ab (zeile #3).

    Wie gesagt: InvokeLabelTextChange() Kann weg.

    ErfinderDesRades schrieb:

    Wie gesagt: InvokeLabelTextChange() Kann weg.
    Der Aufruf ist auskommentiert, die Prozedur somit obsolete.
    Sozusagen aus Versehen mit reingerutscht. ;)
    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!
    Hi,

    also erst mal wie immer herzlichen Dank an die Ratgeber. Soviel Zeit muss sein ... :)

    so habe ich das jetzt realisiert:

    VB.NET-Quellcode

    1. Dim ProcessTimer As System.Threading.Timer
    2. Dim ProcessTimerTS As DateTime = Nothing 'Base time for elapsed seconds
    3. Public Sub StartProcessTimer()
    4. 'Tick : the callback method the timer should invoke
    5. 'nothing: an object to pass into the callback method
    6. '0 : the amount of time the timer should wait before its first call to the callback
    7. '1000 : the number of milliseconds between calls to the callback routine
    8. ProcessTimerTS = DateTime.Now
    9. Debug.Print("Threading timer starting ...")
    10. ProcessTimerSwitch = True 'Register timer as running
    11. grpMain.BackColor = Color.LightGreen 'Just for testing ...
    12. 'Here weeeeeeeeeee go ...
    13. ProcessTimer = New Timer(AddressOf ProcessTimerTick, Nothing, 0, 1000)
    14. End Sub
    15. Public Sub ProcessTimerTick(info As Object)
    16. Debug.Print("ProcessTimerTick: " & DateTime.Now.ToString("HH:mm:ss"))
    17. 'Check. if stop timer was requested externally
    18. If Not ProcessTimerSwitch Then
    19. StopProcesstimer()
    20. Exit Sub
    21. End If
    22. 'Invoke the update routine for seconds text field
    23. Me.Invoke(Sub() Me.UpdateSecs())
    24. End Sub
    25. Private Sub UpdateSecs()
    26. 'txtElapsed.Text = Elapsed(ProcessTimerTS) <-- converted to inline code for EDR
    27. 'Compute and format elapsed time
    28. Dim TS As TimeSpan = DateTime.Now - ProcessTimerTS 'Get elapsed time span
    29. Dim totalsecs = CLng(TS.TotalSeconds) 'Get total seconds
    30. Dim mins = totalsecs \ 60 'Get elapsed minutes
    31. Dim secs = totalsecs Mod 60 'Get remaining seconds
    32. txtElapsed.Text = If(mins = 0,
    33. secs.ToString,
    34. mins.ToString & ":" & secs.ToString.PadLeft(2, "0"c)) 'Format seconds ss or mmm:ss
    35. txtElapsed.Update()
    36. Debug.Print("UpdateSecs: " & txtElapsed.Text)
    37. End Sub
    38. Public Sub StopProcesstimer()
    39. ProcessTimerSwitch = False 'Deregister timer
    40. If ProcessTimer IsNot Nothing Then 'Stop timer if running
    41. ProcessTimer.Dispose()
    42. grpMain.BackColor = Color.Black 'Reset testing color
    43. Debug.Print("Threading timer stopped.")
    44. End If
    45. End Sub
    46. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    47. StartProcessTimer() '***TEST start Timer ****
    48. End Sub
    49. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    50. ProcessTimerSwitch = False '***TEST stop timer ***
    51. End Sub


    Mit dem TEST start / stop funktioniert das auch ganz prima ... ! Der Sekundenzähler läuft ohne Probleme ... ich bin begeistert. Hier ist das Debug Display:

    Quellcode

    1. Threading timer starting ...
    2. ProcessTimerTick: 12:45:46
    3. UpdateSecs: 0
    4. ProcessTimerTick: 12:45:47
    5. UpdateSecs: 1
    6. ProcessTimerTick: 12:45:48
    7. UpdateSecs: 2
    8. ProcessTimerTick: 12:45:49
    9. UpdateSecs: 3
    10. ProcessTimerTick: 12:45:50
    11. UpdateSecs: 4
    12. ProcessTimerTick: 12:45:51
    13. UpdateSecs: 5
    14. ProcessTimerTick: 12:45:52
    15. UpdateSecs: 6
    16. ProcessTimerTick: 12:45:53
    17. Threading timer stopped.


    Bildhübsch ... :)

    Wenn ich das aber jetzt mit meinem Programm starte, dann wird nach dem StartProcessTimer() eine langlaufende Routine ausgelöst ... und mir scheint, dass dadurch der UpdateSecs Befehl "ausgehebelt wird. Jedenfalls wird die Textbox

    VB.NET-Quellcode

    1. txtElapsed
    erst NACH dem Ende der Routine aktualisiert. Ich sehe also keine laufende Sekunden, sondern erst das Endergebnis. Und das ist ja gerade nicht das was ich will ... :(

    Auch das Debug Display sieht jetzt ziemlich konfus aus:

    Quellcode

    1. Threading timer starting ...
    2. ProcessTimerTick: 12:51:28
    3. 'EncryptingBrowser.exe' (CLR v4.0.30319: EncryptingBrowser.exe): Loaded 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Management\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Management.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
    4. The thread 0x3790 has exited with code 0 (0x0).
    5. ProcessTimerTick: 12:51:29
    6. ProcessTimerTick: 12:51:30
    7. ProcessTimerTick: 12:51:31
    8. ProcessTimerTick: 12:51:32
    9. ProcessTimerTick: 12:51:33
    10. UpdateSecs: 5
    11. UpdateSecs: 5
    12. UpdateSecs: 5
    13. UpdateSecs: 5
    14. UpdateSecs: 5
    15. UpdateSecs: 5
    16. ProcessTimerTick: 12:51:34
    17. UpdateSecs: 6
    18. ProcessTimerTick: 12:51:35
    19. UpdateSecs: 7
    20. ProcessTimerTick: 12:51:36
    21. UpdateSecs: 8
    22. ProcessTimerTick: 12:51:37
    23. UpdateSecs: 9
    24. ProcessTimerTick: 12:51:38
    25. UpdateSecs: 10
    26. ProcessTimerTick: 12:51:39
    27. UpdateSecs: 11
    28. ProcessTimerTick: 12:51:40
    29. Threading timer stopped.
    30. The thread 0x26a4 has exited with code 0 (0x0).
    31. The thread 0x44e4 has exited with code 0 (0x0).
    32. The thread 0x25cc has exited with code 0 (0x0).
    33. The thread 0xe4c has exited with code 0 (0x0).
    34. The thread 0x2e4c has exited with code 0 (0x0).
    35. The thread 0xffc has exited with code 0 (0x0).


    Die Meldungen "The thread ... has exited ... " erscheinen erst nach einer Weile, nachdem ich den Timer gestoppt habe.

    Schade ! Das Ganze sah so vielversprechend aus !

    Ich hoffe, dass ich eure Gutmütigkeit nicht gar zu sehr strapaziere ... aber vielleicht wisst ihr ja, was da falsch läuft !

    LG
    Peter

    Peter329 schrieb:

    Wenn ich das aber jetzt mit meinem Programm starte
    Vielleicht änderst Du mal die Thread.Priority. der beiden Threads (Dein Prozess und der Timer).
    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!
    ok .. probiere ich aus ...

    [edit]

    hmm ... irgendwie flutscht das nicht so richtig.

    Also ... ich starte ja nicht mit new Thread ... sondern ich klicke einen Button ... nennen wir ihncmdProcessAllSelected .

    Und in dieser Prozedur starte ich dann zunächst

    VB.NET-Quellcode

    1. StartProcessTimer()
    ... was letztendlich zur Anweisung

    VB.NET-Quellcode

    1. ProcessTimer = New Timer(AddressOf ProcessTimerTick, Nothing, 0, 1000)


    führt.

    Und der Timer stößt dann jede Sekunde die Routine

    VB.NET-Quellcode

    1. ProcessTimerTick(info As Object)


    an.

    Danach rufe ich jede Menge Prozeduren auf, die einige Minuten laufen können ...

    Und dann beende ich meinen Timer.

    Wo und wie soll ich da jetzt die Prioritäten ändern? So wie das in dem von dir verlinkten Beispiel gemacht wird, scheint mir das hier nicht zu funktionieren.

    Aber vielleicht liegt das alles an meinen mangelnden Kenntnissen ... wie so oft .. :)

    Könnte ich noch um einen Rat(nach)schlag bitten ?

    LG
    Peter

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Peter329“ ()

    Peter329 schrieb:

    Danach rufe ich jede Menge Prozeduren auf, die einige Minuten laufen können ...
    Verstehe ich das jetzt richtig?
    Deine Prozeduren und der Timer haben nix miteinander zu tun.
    Du hast einen GUI-Thread, wie überall,
    Du hast einen Timer-Thread, der nur tickt,
    Du hast einen Worker-Thread, in dem Deine Berechnungen ablaufen.
    Kannst Du mal posten, wie Du den zweiten und dritten Thread startest?
    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!
    Mein Programm ist ganz hausbacken. So sieht das in etwa aus:

    VB.NET-Quellcode

    1. Private Sub cmdProcessAllSelected_Click(sender As System.Object, e As System.EventArgs) Handles cmdProcessAllSelected.Click
    2. lblMessage.Text = "Process ALL started FromDrive=" & strFromDrive & ": ToDrive=" & strToDrive & ": " & strTestModeMsg
    3. lblMessage.Update()
    4. StartProcessTimer()
    5. 'Check and set volser
    6. If chkSetSerial.Checked Then
    7. lblMessage.Text = "Save disk SerialNumber ..." & strTestModeMsg
    8. lblMessage.Update()
    9. SetSavedDiskSerialNumber(strToDrive,
    10. chkTestMode.Checked,
    11. strTestModeMsg,
    12. blnMessageBox:=True)
    13. End If
    14. 'Copy Browser
    15. If chkCopyBrowser.Checked Then
    16. lblMessage.Text = "Copy Browser ... " & strTestModeMsg
    17. lblMessage.Update()
    18. CopyBrowser(strToDrive)
    19. End If
    20. 'usw. usw. ...
    21. StopProcesstimer()
    22. lblMessage.Text = "Process all completed."
    23. lblMessage.Update()
    24. End Sub


    Die per CheckBox ausgewählten Aufgaben werden der Reihe nach abgearbeitet. Dabei wird jeweils angezeigt, wo wir uns gerade befinden (das funktioniert Dank deines genialen Ratschlags jetzt fehlerfrei). Und außerdem soll während der gesamten Verarbeitung ein "Sekundenzähler" laufen. Der wird per StartProcesstimer angestoßen und per StopProcesstimer am Ende angehalten.


    Das ist alles ... meine Prozeduren und der Zähler haben nix miteinander zu tun. Leider läuft der Zähler nicht, während der Verarbeitung !


    Ich hoffe, ich habe mein Problem verständlich machen können. :)

    LG
    Peter

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

    @Peter329 Wo wird denn da ein Thrfead gestartet oder mit Async gearbeitet?
    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!
    Nirgendwo !

    Ich starte den Zähler mit StartProcesstimer

    Und das Coding steht in meinem Post #10.

    Das ist alles ! :)

    Der Zähler läuft auch problemlos ... nur eben nicht während der Verarbeitung ... und das ist mein Problem. (s. Anhang)

    LG
    Peter
    Bilder
    • nach der Verarbeitung.jpg

      24,84 kB, 936×132, 67 mal angesehen
    • während der Verarbeitung.jpg

      25,33 kB, 936×132, 72 mal angesehen

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

    @Peter329 Ist natürlich klar.
    Wenn der GUI-Thread die Arbeit macht, hat er keine Zeit zum Updaten, da wird das Update zwischen zwei Prozeduren gemacht.
    Würde es Dir genügen, wenn die Zeiten in eine List(Of T) geloggt werden?
    Die Zeiten sollten dann unabhängig vom GUI-Status sein.
    ====
    Warum lagerst Du die Arbeit nicht in separate Threads (Plural) aus?
    Sind die Prozesse parallelisierbar?
    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!

    RodFromGermany schrieb:

    Warum lagerst Du die Arbeit nicht in separate Threads (Plural) aus?


    Also allein diese Form hat rund 12.000 Zeilen Code ... das Programm funktioniert fehlerfrei ... da möchte ich eigentlich nicht anfangen und viel umstellen.

    RodFromGermany schrieb:

    Sind die Prozesse parallelisierbar?


    Definitiv nein. Die Funktionen müssen in genau dieser Reihenfolge ausgeführt werden.

    RodFromGermany schrieb:

    Würde es Dir genügen, wenn die Zeiten in eine List(Of T) geloggt werden?


    Was soll mir das denn bringen ? Ich will doch einen "laufenden Zähler" haben. Am Ende jeder Funktion die Laufzeit in Sekunden auszugeben, das ist kein Problem (das mache ich ohnehin schon im Log).

    Aber jetzt mal ganz im Ernst: wenn das wirklich so ein Problem im VB ist, während der Verarbeitung einen simplen Sekundenzähler am Bildschirm anzuzeigen, dann werde ich mir das halt verkneifen. Nur wundert mich das schon ein bissl. Was ist denn dann der Nutzen von so einem '"Threading Timer", wenn er dann doch nicht multitasking fähig ist ? Ich komme aus der Welt der IBM Großrechner ... und im MVS war das schon vor 30 Jahren kein Problem so etwas zu realisieren ... da hat man einen ECB (event control block) geposted und den alle Sekunden feuern lassen ...

    Aber das waren halt die Zeiten der prozeduralen Programmiersprachen. Jetzt haben wir ja die schöne neue Welt, der totalen Objektorientierung ! Na, hab ich jetzt euren Ehrgeiz geweckt ? :)

    LG
    Peter

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

    Das ist dann aber kein Problem/Thema der Objektorientierung. Im Gegenteil. Wir sind eher beim Thema Single-minded-Prozedurabarbeitung. Ein Schritt nach dem anderen. Jeder Schritt hat absolute Priorität, bis er abgearbeitet ist. Dann folgt erst der nächste. Wie es IBM gemacht hat? Wohl auch durch Parallelisierung. Aber das ist vorweihnachtliches Spekulatiusbacken.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed Also jetzt lassen wir mal die Kirche im Dorf. Es geht hier um einen Ablauf, der zwingend in dieser Weise abgehandelt werden muss. Das ist einfach die Anforderung und hat nix mit Philosophie zu tun und darüber gibt es nix zu diskutieren.

    Ich möchte während der Verarbeitung schlicht und ergreifend einen simplen Sekundenzähler "ruckelfrei" anzeigen. Das sollte im Jahr 2020 n. Chr. doch eigentlich möglich sein ... Oder ist denn mein Anliegen gar so abwegig ? :)

    LG
    Peter

    Vollzitat entfernt ~ EaranMaleasi

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