Lauftext

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

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Hey Liebe Community, habe malwieder ein kleines Problem
    (Mit mir wird euch nie langweilig :) )

    Also ich probiere einen Info Lauftext zu basteln. (Auch mit den Sachen aus meinem letzten thema) Der Code + Lauftext funktioniert problemlos während der Laufzeit!
    Problem: Immer wenn ich mein letztes Form schließe giebt mir das Programm einen allgemeinen fehler aus:

    Quellcode

    1. (System.InvalidOperationException: "Der Wert Dispose() kann nicht während der Ausführung von CreateHandle() aufgerufen werden.")


    Weiß jemand warum das kommt? Muss man den Task erst schließen oder was? :) Bitte hilfe!

    Hier noch der Code, der code funktioniert so einwandfrei :)

    VB.NET-Quellcode

    1. Dim Infos() As String = IO.File.ReadAllLines("C:/Server_Manager/Infos.txt")
    2. If Infos(0).Length > 0 Then
    3. Dim act As New Action(AddressOf infoworker)
    4. act.BeginInvoke(AddressOf act.EndInvoke, Nothing)
    5. End If


    Hier dann der code der die ganze Laufzeit arbeiten soll: (ToolStripMenuItem4 = Hier soll der Text reingeschreiben werden)

    VB.NET-Quellcode

    1. Dim Infos() As String = IO.File.ReadAllLines("C:/Server_Manager/Infos.txt")
    2. Try
    3. Dim Infostring As String
    4. Try
    5. For x = 0 To 500
    6. Infostring = Infostring + " " + Infos(x) + " "
    7. Next
    8. Catch ex As Exception
    9. If Infostring.Length = 0 Then
    10. Exit Sub
    11. End If
    12. End Try
    13. If Infostring.Length <= 100 Then
    14. ToolStripMenuItem4.Text = Infostring
    15. Exit Sub
    16. End If
    17. Do While (0 <= 10)
    18. For x = 0 To Infostring.Length - 100
    19. ToolStripMenuItem4.Text = Infostring.Remove(0, x).Remove(100, Infostring.Length - (100 + x))
    20. System.Threading.Thread.Sleep(70)
    21. Next x
    22. Loop
    23. Catch ex As Exception
    24. ToolStripMenuItem4.Text = "---"
    25. End Try


    MFG
    Nun, m.E. zeigt Dein Code nichts Relevantes für das Problem an. Solch eine Fehlermeldung tritt z.B. auf, wenn Du in der Form_Load-Prozedur dieselbige wieder abschießt. Zeig doch mal die Prozedur+betroffene Zeile, in der der Fehler auftritt.
    btw: Zeile 21: Do While 0 <= 10? 0 ist IMMER kleiner 10. Ist der größere Codebereich aus Deinem Nebenthread? Alles so verwirrend ...
    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.
    @SidezockingLP Ich denke mal, dass Du den Thread beenden solltest, bevor Du Dein Programm zumachst.
    Threads sollten freiwillig ihre Arbeit beenden, nicht aber mit dem Holzhammer beenden :!:
    Dazu musst Du in Deine Endlosschleife eine Abbruchbedingung einarbeiten, die spätestens im FormClosing-Event zuschlägt:
    Einfach ein Flag, das bei Beendigung gesetzt wird, woraufhin die Schleife verlassen und damit der Thread beendet wird.
    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!
    Okke also

    @RodFromGermany Das heißt ich könnt eine My.Settings (=Boolean) machen mit default= false und diese dann beim formclosing event auf true setzen und gleichzeitig in meiner Dauerschleife diesen Wert die gnaze zeit prüfen? Das währe zwar warscheinlich nicht die beste lösung aber müsste gehen oder?

    @VaporiZed
    ​btw: Zeile 21: Do While 0 <= 10? 0 ist IMMER kleiner 10. Ist der größere Codebereich aus Deinem Nebenthread? Alles so verwirrend ...

    Das ganze soll eine dauerschleife darstellen da ich ja den lauftext während der ganzen Laufzeit ändern will :)

    MFG
    1. Wer ne Dauerschleife will, schreibt Do ... Loop. Ohne jegliche Bedingung.
    2. Die My.Settings.Methode mit dem Boolean lässt sich wohl genau dort einbauen: Do Until My.Settings.ProgramIsShuttingDown ... Loop
    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.

    SidezockingLP schrieb:

    Das währe zwar warscheinlich nicht die beste lösung aber müsste gehen oder?
    Jou, das wäre Dummfug. @VaporiZed Von Dir hätte ich erwartet, dass Du das als Dummfug erkennst. :/
    Was hat die Laufzeit-Information, dass ein Thread abgebrochen werden soll, in den Settings zu suchen?
    Mach in der MainForm oder da, wo der Thread deklariert wird, eine Pubic Boolean Vatiable hin, so dass Du sowohl von der MainForm als auch vom Thread aus drauf zugreifen kannst und feddich.
    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!
    Verbesserungsvorschlag für @Sidezockngs Code

    VB.NET-Quellcode

    1. Private Async Sub Infoworker() ' Bitte bei Posts auch den Methoden-Kopf mit-posten: Dann weiß man wie die Methode heißt, und wie sie aufzurufen ist!
    2. Dim Infos() As String = IO.File.ReadAllLines("C:/Server_Manager/Infos.txt")
    3. Dim spaces = New String(" "c, 20)
    4. Dim Infostring = spaces & String.Join(spaces, Infos)
    5. If Infostring.Length <= 100 Then
    6. ToolStripMenuItem4.Text = Infostring
    7. Return
    8. End If
    9. Do
    10. For i = 0 To Infostring.Length - 1
    11. If Me.IsDisposed Then Return ' des eiglichen Problems Lösung
    12. ToolStripMenuItem4.Text = Infostring.Substring(i, Math.Min(100, Infostring.Length - i)) 'maximal 100 Zeichen
    13. Await Task.Delay(70)
    14. Next
    15. Loop
    16. End Sub
    Diese Methode bitte normal aufrufen - kein Threading-Gedöhns - weil das ist ja bereits eingebaut (Async).
    Deine TryCatches sind eine groteske Methode, ein Ende aus einer Schleife zu finden. Wie zu sehen, gibts da vielfach bessere Konstrukte.
    Wie weit bist du mit meine Tuts - hast du die VB.Net-Grundeinstellungen inzwischen korrigiert (Punkt 1 der Liste)?

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