AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Stack overflow bei Timer

Ein Thema von netscanner · begonnen am 21. Jun 2006 · letzter Beitrag vom 22. Jun 2006
Antwort Antwort
Benutzerbild von netscanner
netscanner

Registriert seit: 2. Dez 2005
Ort: Dieburg
280 Beiträge
 
Delphi 6 Enterprise
 
#1

Stack overflow bei Timer

  Alt 21. Jun 2006, 17:12
Delphi-Quellcode:
procedure SStop; // Sprung (stop)
begin
  If ((InGame1.iSp1.Top + InGame1.iSp1.Height) >= InGame1.iFloor.Top) // Stop durch Boden
   or (InGame1.iSp1.Top <= InGame1.Top) then // Stop durch Decke
    begin
      tCount := 0;
      InGame1.S.Enabled := false;
      InGame1.iSp1.Top := InGame1.iFloor.Top - InGame1.iSp1.Height
    end;
end;


procedure TInGame1.STimer(Sender: TObject); // Sprung
begin
  SStop;
  tCount := tCount +1;
  If tCount < 80 then iSp1.top := iSp1.top -1
  else if tCount > 80 then
    begin
      kill;
      iSp1.top := iSp1.top +1;
    end;
end;
Ich sags gleich: Der Code ist von nem Freund...
Derjenige hat das Problem, dass er einen Stack overflow bekommt sobald dies hier im code ausgeführt wird (also der Timer gestartet wird und die else abfrage im Timer ausgeführt wird...)
Das Problem ist, dass wir weder wissen was ein Stack overflow ist, noch wie wir ihn beheben
Könnt ihr uns helfen?
Martin
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#2

Re: Stack overflow bei Timer

  Alt 21. Jun 2006, 17:18
Stack Overflow tritt vor allem auf, wenn du eine Procedure oder Function hast die sich selber wieder aufruft. Soweit ist grundlegend erstmal nichts verdächtiges in der Richtung zu erkennen, aber die Procedure Kill; fehlt aber noch. Diese solltest du mal bitte posten.

Ich sehe aber an dem Quelltext grundlegende Dinge die nicht so ganz in Ordnung sind. So ist SStop nur eine Procedure und keine Methode wie der OnTimer Ereignishandler, welcher SStop aufruft. Und durch diesen Fakt fehlen in SStop die Elemente der Klasse TInGame1 und dies wurde so gelöst, dass direkt über die Instanzenvariable auf deren Elemente zugegriffen wird. Nun hat man aber bei diesem Zugriff das Problem, dass man immer nur auf eine mögliche Instanz zugreift und somit die Aktion mit dem Timer für die komplett falsche Instanz ausführt. Dieses ist kreuz-gefährlich, daher sollte dies eigentlich behoben werden, aber ich denke mal das du bzw. dein Freund das nicht so als Problem seht.

Grundlegend bitte mal die Procedure Kill hier posten...
  Mit Zitat antworten Zitat
EDatabaseError

Registriert seit: 11. Mai 2005
Ort: Göppingen
1.238 Beiträge
 
Delphi 2007 Professional
 
#3

Re: Stack overflow bei Timer

  Alt 21. Jun 2006, 17:24
du könntest im Linker den Stack mal größermachen und schaun obs dann geht wenn nein dann ... ...

Mfg
tobi
Tobias
It's not a bug, it's a feature.
  Mit Zitat antworten Zitat
Benutzerbild von netscanner
netscanner

Registriert seit: 2. Dez 2005
Ort: Dieburg
280 Beiträge
 
Delphi 6 Enterprise
 
#4

Re: Stack overflow bei Timer

  Alt 21. Jun 2006, 18:09
Delphi-Quellcode:
procedure Kill; // Gegner tot
begin
  If ((InGame1.iSp1.Top + InGame1.iSp1.Height) > (InGame1.iEnemy1.Top)) and //kollision von oben
     ((InGame1.iSp1.Top + InGame1.iSp1.Height) < (InGame1.iEnemy1.Top + InGame1.iEnemy1.Height)) then
    begin
      InGame1.iSp1.Top := InGame1.iFloor.Top - InGame1.iSp1.Height;
      MonsterPos;
      inc(kills);
      InGame1.lKills.Caption := 'Getötete Gegner: '+IntToStr(kills);
    end;
end;
Martin
  Mit Zitat antworten Zitat
Benutzerbild von JasonDX
JasonDX
(CodeLib-Manager)

Registriert seit: 5. Aug 2004
Ort: München
1.062 Beiträge
 
#5

Re: Stack overflow bei Timer

  Alt 21. Jun 2006, 18:41
es gibt AFAIR 3 Moeglichkeiten, um mit nem Timer nen Stackoverflow zusammenzubasteln:
  1. Den Stack zu klein halten
  2. Delphi-Quellcode:
    procedure TForm1.OnTimer1(Sender: TObject);
    begin
      OnTimer1(Sender);
    end;
  3. Delphi-Quellcode:
    procedure TForm1.OnTimer1(Sender: TObject);
    begin
      sleep(...); //Irgendeine verzoegerung, die min. so lange braucht wie der Timer bis zum naechsten Tick... Sei es Berechnungen, Funktionsaufrufe ect.
      Application.ProcessMessages;
    end;
Bei deinem Problem tippe ich auf drittens. Geh mal alle Prozeduren durch, die beim Timer-Event aufgerufen werden, und schau mal, ob du dort neue Nachrichten verarbeitest, sprich ein Application.ProcessMessages im Code schlummern hast.

greetz
Mike
Mike
Passion is no replacement for reason
  Mit Zitat antworten Zitat
Benutzerbild von netscanner
netscanner

Registriert seit: 2. Dez 2005
Ort: Dieburg
280 Beiträge
 
Delphi 6 Enterprise
 
#6

Re: Stack overflow bei Timer

  Alt 22. Jun 2006, 17:40
hat sich erledigt...eine andere prozedur die mit timer in verbindung war hat sich selbst aufgerufen...
Martin
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:52 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz