Announcement

Collapse
No announcement yet.

StackOverflowException bei Timer

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • StackOverflowException bei Timer

    Ich habe nun eine Denksperre, deswegen wende ich mich ans Forum.
    Ich habe ein Spiel geschrieben (Spielidee nicht von mir), das hat mir dann so gut gefallen, dass ich „Computer gegen Computer“ implementiert habe. Damit man etwas beobachten kann, habe ich einen Windows Forms Timer zur Zeitverzögerung zwischen den Spielzügen eingebaut. Sieht toll aus, aber Frust kommt nach ca. 10 Minuten, Timer wurde dann ca. 200 „benutzt.
    Dann erfogt die Fehlermeldung StackOverflowException wurde nicht behandelt.

    Eine nicht behandelte Ausnahme des Typs „System.StackOverflowException ist in system.Drawing.Dll aufgetreten.

    Stellen Sie sicher, dass sich keine Endlosschleife ergibt. Für diese Ausnahme die allgemeine Hilfe aufrufen.

    Der Ausdruck kann nicht ausgewertet werden, weil sich der aktuelle Thread in einem Stapelüberlaufzustand befindet.

    Im Moment bin ich betriebsblind und finde seit Stunden keine Lösung.

    Hat jemand einen Hinweis?

  • #2
    Eine nicht behandelte Ausnahme des Typs „System.StackOverflowException ist in system.Drawing.Dll aufgetreten.
    Die Exception sollte auch den eigentlichen StackTrace enthalten. Wenn du dir denn ansiehst solltest du erkennen können aus welcher Ecke der Stackoverflow kommt. Wenn du keinen Stack erhältst weil beim Auftreten der Exception schon alles aus dem Ruder gelaufen ist kannst du ja mal während dem Debuggen den Programmlauf anhalten und versuchen den Stack zu interpretieren.


    Da du den Timer ansprichst wäre eine offensichtliche Vermutung das das was du im Timer machst länger dauert als dein Timer.Interval eingestellt ist. Dann stapeln sich natürlich deine Timerevent Aufrufe auf dem Stack.

    Comment


    • #3
      Danke, in der Richtung hatte ich auch schon gesucht, abern keinen Fehler bei mir gefunden. Auch heute ist der Fehler noch da, obwohl ich schon an vielem rumgebastelt habe. Kannst Du mir, aus reiner Verzweiflung, einen Tip geben, wie ich mein Programm an bestimmten Stellen verzögern kann, ohne auf Timer zu setzen. Die jetzige Version einer Verzögerung lautet:#
      public void zeitschleife(int millisek)
      {
      System.Threading.Thread.Sleep(millisek);
      Application.DoEvents();

      }

      Tatsächlich wird der Programmlauf auch entsprechend verlangsamt, ich bin zufrieden. Wenn nur nicht das verdammte Programm nach ca. 1000 Aufrufen an der Stelle Application.DoEvents(); austeigen würde.

      Comment


      • #4
        Ich weiß nicht ob der Timer das richtige Element ist um eine Verzögerung im Programm zu bewirken, für mich ist der Timer dafür da bestimmte Ereignisse in wiederkehrenden Zeiträumen aufzurufen.

        Wenn ich mein Programm ausbremsen muss dann benutze ich wie oben angegeben den ...Thread.Sleep mit der entsprechenden Zeit und hatte noch kein Problem mit Stack Overflows

        Im Normalfall würde ich einfach so vorgehen:
        - Spielzug berechnen
        - Ergebnis anzeigen
        - Sleep
        - den ganzen Käse von vorne

        aber ohne Timer Event. (Zumindest nicht wegen dem Sleep)
        Hast Du evtl. sonst noch andere Timer? Nicht das die was arbeiten wollen während Dein Sleep läuft und damit den "normalen" Ablauf unterbricht.

        Gruß Womble

        Comment


        • #5
          Hallo, Danke für Eure Hilfe. Auch wenn ich zum Schluss das Problem radikal gelöst habe, war Euer Hinweis mir eine wichtige Hilfe. Ich vermute, irgendwo im Programm, dass zum Schluss sehr komplex und "intelligent" wurde, hat sich eine Rekursion eingeschlichen. Das geht bei sehr vielen parallelen Berechnungen sehr schnell. Ich habe einen Schlussstrich gezogen und völlig von Vorne angefangen. Dabei habe ich das Programm umstrukturiert, das war nicht unbedingt nötig, sieht jetzt aber auch professioneller aus.

          Das Umstrukturieren hat nicht lange gedauert, sagen wir 4 Stunden. Jetzt läuft das Programm einwandfrei.

          Ich weiss nicht, wieviele Stunden ich in die Fehlersuche reingesteckt habe, 10, 20, 30?

          Vielen Dank Kollegen.
          Werner

          Comment


          • #6
            Hallo,
            wie bereits oben von mir angeführt, das Programm läuft nun seit vielen Stunden erfolgreich. Ich habe dennoch ein paar Fragen, die mir vielleicht in Zukunft weiterhelfen. Voreher noch ein paar Aussagen zu mir: Ich beschäftige mich mit mathematischen Modellen und Parallel-Programmierung, nicht unbedingt mit Threads, ich will das aber nicht weiter ausführen. Mir ist folgendes aufgefallen (im nachhinein):
            Ich habe nun ein paar Threads zum Spaß entwickelt. Warum erscheinen die nicht im Taskmanager? Ein "paralleler Prozeß" als "eigenständiges Programm" erscheint hier sehr wohl, aber wenn ich aus einem Programm einen Threadf erzeuge, wird dieser nicht angezeigt.

            Ist nicht so wichtig, würde mich aber interessieren.

            Danke und viele Grüße
            Werner

            Comment


            • #7
              Ein Thread ist eben eine Untereinheit eines Prozesses Sprich viele (oder auch nur ein) Thread sind ein Prozess.

              Comment


              • #8
                Der Taskmanager hält diese Information nicht für wichtig genug um Sie zu präsentieren. Irgendwer musste in der Vergangenheit mal entscheiden was den im Taskmanager präsentiert wird und die Ansicht der Threads hat den Cut einfach nicht geschafft(wie vieles andere auch nicht).

                Es gibt aber alternative Taskmanager die dir das anzeigen.

                Siehe z.b. http://technet.microsoft.com/en-us/s...rnals/bb896653

                Comment

                Working...
                X