StackOverflowException

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von r0tzi.

    StackOverflowException

    Hi,

    ich habe eine Form, auf der ich 3 Wrap panels habe und auf diesen Images und Textboxen dynamisch erstelle. Verlasse ich die form, verkleinert sie sich, dass sie aus dem arbeitsbereich ist. Dazu habe ich einen kleinen delay eingebaut, dass nicht instat beim Mouse-Leave event die Form weg ist, sondern dass sagen wir mal 0,5 Sek die form offen bleibt. Falls ich in diesen 0,5Sek zurück in die Form mit der Maus komme, bleibt sie natürlich offen. Da ich die Form nicht einfrieren möchte in den 0,5sek habe ich:

    VB.NET-Quellcode

    1. Dim sw As New Stopwatch
    2. sw.Start()
    3. Do While sw.ElapsedMilliseconds < interval
    4. Windows.Forms.Application.DoEvents()
    5. Loop
    6. sw.Stop()


    eingebaut. wenn ich nun so 10-20 Images und textboxen auf der Form habe, funktioniert alles einwandfrei. Wenn ich nun jedoch sagen wir mal 100 Images und textboxen drauf habe, dann knallt es bei 2-3 mal öffnen und schliessen der form mit:

    Process is terminated due to StackOverflowException.

    Visual studio zeigt mit den Fehler bei Windows.Forms.Application.DoEvents()

    nun habe ichetwas rumgesucht woher das kommt, eine endlosscheife konnte ich jedoch nicht finden ( klar weil sonst würde es auch bei 20 Objekten knallen) ...

    Da ich letztendlich nur die Form kleiner u nd grösser mache, kann es ja nicht an der anzahl den Objekten liegen oder? Wer hat eine idee oder brauch noch infos?

    *Thema verschoben da kein WPF Thema* ~NoFear23m

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

    Wenn sich deine Form minimiert, arbeitet dann dein Programm an irgendetwas? Wenn nicht, kannst du Application.DoEvents() mal komplett vergessen. Ein Programm, das nichts aktiv tut, wird nicht einfrieren.

    Darüber hinaus, solltest du Application.DoEvents() generell vergessen, und dich damit auseinandersetzen, wie man langwierige Operation richtig abarbeitet, ohne die Form dabei einzufrieren. Das ist entweder das erstellen von Thread-Objekten und das korrekte Invoken auf den GUI Thread, oder aber Async/Await mit Tasks ab .NET 4.5

    r0tzi schrieb:

    eine endlosscheife konnte ich jedoch nicht finden


    r0tzi schrieb:

    Do While sw.ElapsedMilliseconds < interval
    Windows.Forms.Application.DoEvents()
    Loop

    Wir kennen interval nicht. aber hier könnte die endlosschleife auftreten.
    ElapsedMilliseconde wird einfach nie größer als "interval" sein.

    EDIT: Ups, überlesen das es bei 20 Controls funzt.
    Wenn du nur warten willst um ein Form anschliessend zu minimieren. Warum dann so?
    Warum keinen Timer mit 500ms Interval starten und nach dem durchlauf stoppen?

    Grüße
    Sascha

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

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

    blog.codinghorror.com/is-doevents-evil/
    Application.DoEvents ist womöglich asynchron, was bedeutet, es "returned" nicht wenn es fertig ist, sondern eher sobald es die Arbeit aufgenommen hat. Die Arbeit mag bei 2-3 Controls gering sein, doch bei fast 200 controls, die dann ihre Events abarbeiten, ist die Schleife schneller als die überlappenden Aufrufe an Application.DoEvents() ihre Arbeit erledigt haben. Und schon haben wir eine StackOverflowException

    Edit:
    Ich sehe gerade der Link ist noch aus .NET 1.0/1.1 Zeiten... Daher öhm... joa. Kann stimmen, muss nicht.

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

    Wir kennen interval nicht. aber hier könnte die endlosschleife auftreten.

    das ist nur ein integer wert wo man einstellen kann wieviel ms er warten soll.

    Quellcode

    1. Warum keinen Timer mit 500ms Interval starten und nach dem durchlauf stoppen?

    ja das scheint zu funktionieren, danke.

    Application.DoEvents ist womöglich
    asynchron, was bedeutet, es "returned" nicht wenn es fertig ist, sondern
    eher sobald es die Arbeit aufgenommen hat


    hm wird nicht async aufgerufen von mir *hab wieder die hälfte vergessen*

    VB.NET-Quellcode

    1. Public Sub Wait(ByVal interval As Integer)
    2. Dim sw As New Stopwatch
    3. sw.Start()
    4. Do While sw.ElapsedMilliseconds < interval
    5. Windows.Forms.Application.DoEvents()
    6. Loop
    7. sw.Stop()
    8. End Sub


    ja @EaranMaleasi da könntest du recht haben. habs nun mit dem Timer gemacht und bei knapp 900 stürzt er nicht mehr ab.. er braucht nur noch länger :D

    Vielen Dank

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