Autor Beitrag
HenryHux
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 542
Erhaltene Danke: 33

Windows 7 Premium
Delphi XE, Eclipse
BeitragVerfasst: Do 18.11.10 15:33 
Hi, schon wieder nen Titel, den ich wirklich nicht wirklich aussagekräftig hinbekommen habe :D
Habe immoment mehrere Prozeduren, die immer wieder aufeinander mit Goto (weiß, sollte anderes nehmen, geht aber nicht) verlinken.
Das Problem mit Goto dabei ist, dass ich in einer Prozedur ein Goto aufrufe, er zum Schluss der Prozedur in eine unerfüllbare Bedingung springt und da dann anschließend einen anderen Prozess aufruft, und es geht wieder von vorne los.
Die Methode geht nach einer Zeit ziemlich auf den Speicher, ohne Leaks. Wenn ich dann die Schleifen in der Prozedur per Hotkey beende, geht der Speicherverbrauch wieder in die Ausgangssituation zurück. Ich denke mal, dass das Problem ist, dass hinterher 500 Prozeduren ineinander aufgerufen wurden, und nie beendet wurden.
Aber wie gesagt, habe eine Prozedur, die alle beenden kann und dann schwillt alles ab.
Zu meiner eigentlichen Frage:
Ich will diese Prozedur nach einer bestimmten Zeit betätigen, um kurz den Speicher "abzukühlen", danach soll er aber direkt wieder mit einer Prozedur loslegen, nachdem alles zuende gelaufen ist.
Also soll er Praktisch aus dem Nichts etwas starten.
Hoffe, das war etwas verständlich :D
Vielleicht kennt ihr ja eine Möglichkeit

Lg

Henry

PS: Bitte keine Kommentare zum Goto =)
Nersgatt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: Do 18.11.10 15:36 
Du bekommst aber doch einen Kommentar zum Goto. Es gibt immer Möglichkeiten, Goto zu vermeiden.

Die Beschreibung Deines Problems klingt so, als hättest Du ein Grundlegend falsches Design Deines Programmes gemacht. Und genau dort sollte man ansetzen, anstatt an den Symptomen rumzudoktern.

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
Bergmann89
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1742
Erhaltene Danke: 72

Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
BeitragVerfasst: Do 18.11.10 15:37 
Hey,

dafür gibts den TTimer. Einfach mal bei den Standart-Komponenten suchen. Da stellste ein Intervall ein und dann wird die Timer-Prozedur alle x Millisekunden aufgerufen. Da kannste jetz deine Button-Prozedur rein schreiben und danach die neue starten.
Noch was zu dem Goto (auch wenn du es nicht hören willst): Da es bereitet jetz schon Probleme wie man sieht und bricht dir früher oder später das Genick. Es gibt sicher eine andere Lösung über nomale Funktionen, Prozeduren und Klassen, die du im Augenblick vlt nicht erkennt ;)

MfG Bergmann.

_________________
Ich weiß nicht viel, lern aber dafür umso schneller^^
HenryHux Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 542
Erhaltene Danke: 33

Windows 7 Premium
Delphi XE, Eclipse
BeitragVerfasst: Do 18.11.10 15:51 
Zitat:
Da kannste jetz deine Button-Prozedur rein schreiben und danach die neue starten.

Ich glaube nicht, dass das ganz klappt. Angenommen ich starte die Prozedur, lege alle Schleifenbedingungen der Prozedur die ich beenden will auf aus, dann würde die Haupt-Prozedur aufhören, sobald die Prozedur, die alles ausmacht, beendet ist. Doch wenn ich in dieser Prozedur direkt wieder die Haupt-Prozedur starte, dann hat mich das ja eigentlich nicht weitergebracht oder?
Oder habe ich dich missverstanden?

@Anti-Goto comments: Ich arbeite dran, aber ich würde das gleiche Problem bekommen, wenn ich nicht mit Goto arbeiten würde.
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8554
Erhaltene Danke: 481

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Do 18.11.10 15:59 
Speicher abkühlen? Sorry, aber irgendwas ist da vermurkst. Entweder dein Program benötigt wirklich so viel Speicher, oder du machst irgendwo was falsch.
Sehe ich das richtig, dass du GoTos quer durch dein Programm hast, und damit von der einen Prozedur zur anderen springst? Warum rufst du die Prozedur nicht direkt auf?

Was machst du denn da, dass du so wild hin- und her springen musst?

_________________
We are, we were and will not be.
Bergmann89
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1742
Erhaltene Danke: 72

Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
BeitragVerfasst: Do 18.11.10 15:59 
Hey,

user profile iconHenryHux hat folgendes geschrieben Zum zitierten Posting springen:
Ich will diese Prozedur nach einer bestimmten Zeit betätigen, um kurz den Speicher "abzukühlen", danach soll er aber direkt wieder mit einer Prozedur loslegen, nachdem alles zuende gelaufen ist.


Im Timer die "abkühlen"-Prozedur starten un danach die aufrufen, mit der er weiter machen soll. Oder ichhab jetzt was falsch verstanden.
Was hast du eig genau vor? Wenn du den speicher so voll packst, dann stimmt was nicht. Außerdem hast du ja gesagt, das die "abkühlen"-Prozedur den Speicher frei gibt, das ergibt aber kein Sinn. Entweder der Speicher wird freiegegben, wenn eine bestimmte Berechnung abgeschlossen ist, oder der Speicher wird noch für die Berechnung benötigt. Wenn du jetzt die Berechnung abbrichst um den Speicher leer zu machen rechnet er ja umsonst?! Ich glaub wir kommen so auch nicht weiter. Das wird so ähnlich wie in deinem anderen Thread. Für das beschriebene Problem wird die Lösung genannt, aber in deinem Programm soll sie nicht gehen. Aber richtig helfen könn wir dir auch nicht, weil wir nicht wissen was das Programm machen soll....

MfG Bergmann.

_________________
Ich weiß nicht viel, lern aber dafür umso schneller^^
HenryHux Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 542
Erhaltene Danke: 33

Windows 7 Premium
Delphi XE, Eclipse
BeitragVerfasst: Do 18.11.10 16:07 
Das Programm arbeitet mit Repeat Schleifen, die ich einfach mit einer Bedingung aussetzen kann.
Es geht nicht wirklich um Speicherverbauch, den man mit .free o.ä auflösen könnte, nein es geht darum, dass hinterher verdammt viele Prozeduren "ineinander geschachtelt" sind.
Ich will also mit einem Befehl einfach mal alles durchlaufen lassen, sodass das Programm praktisch im Leerlauf ist. Nur mein Problem ist es etwas zu starten, obwohl keine Aktion/Prozedur läuft.
Deine Lösung ruft ja eine weiter Prozedur auf, und die Prozedur die die aufruft, geht ja erst weiter wenn diese beenden-prozedur beendet wurde. Aber wenn diese beenden-prozedur direkt ne neue Prozedur aufruft, schieß ich mir selber ins Bein, oder denke ich da falsch?

Lg
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8554
Erhaltene Danke: 481

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Do 18.11.10 16:13 
Wie schon gesagt: Du hast da mit ziemlicher Sicherheit ein verkorkstes Konzept und versuchst jetzt, an den Symptomen herumzudoktorn, anstatt die Ursache zu bekämpfen. Allein der Aufruf von "verdammt vielen ineinander verschachtelten Prozeduren" mit offensichtlich überall "Application.ProcessMessages" drin (sonst klappt das Abbrechen ja nicht, oder arbeitest du mit Threads?) ist ein klarer Hinweis für ein totales Chaos. ;-)

Aber ohne Infos dazu, was du mit deinem Programm machen willst, kann mam da nicht weiterhelfen.

_________________
We are, we were and will not be.
platzwart
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1054
Erhaltene Danke: 78

Win 7, Ubuntu 9.10
Delphi 2007 Pro, C++, Qt
BeitragVerfasst: Do 18.11.10 16:14 
Das ganze klingt wirklich nach einem total vermurksten Konzept. Außerdem: NIEMALS goto verwenden und das "Abkühlen" klingt äußerst misteriös.

_________________
Wissenschaft schafft Wissenschaft, denn Wissenschaft ist Wissenschaft, die mit Wissen und Schaffen Wissen schafft. (myself)
HenryHux Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 542
Erhaltene Danke: 33

Windows 7 Premium
Delphi XE, Eclipse
BeitragVerfasst: Do 18.11.10 16:26 
Ok, überzeugt, anfangs dachte ich Goto würde funktionieren.
Ich überarbeite mal mein Konzept und melde mich wieder.
Hätte ichs mal früher gemacht -.- Bei 20k Zeilen wirds dann jetzt schwierig

lg
Bergmann89
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1742
Erhaltene Danke: 72

Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
BeitragVerfasst: Do 18.11.10 16:29 
Hey,

wenn das neue Konzept dann steht würd ich eh alles neu schreiben. Bei schwierigen Sachen kannste ja ab un zu ma in den alten Code gucken. Aber ich denke bei den unmengen an Goto-Anweisungen ist das das beste...

MfG Bergmann.

_________________
Ich weiß nicht viel, lern aber dafür umso schneller^^
HenryHux Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 542
Erhaltene Danke: 33

Windows 7 Premium
Delphi XE, Eclipse
BeitragVerfasst: Do 18.11.10 17:06 
Immoment bin ich noch stark am überlegen, wie ich es umschreibe.
Habe mir überlegt, dass ich eine Prozedur mache, die durchläuft, wird nur ein paar Zeilen haben und praktisch keinen Content, also eine Grundstruktur.
Die ruft immer wieder meine Prozedur1 auf. In der Prozedur1 ersetze ich das goto prozedur1 (also wieder von vorne anfangen) durch ein einfaches exit. Wenn das betätig wird, dann geht es zurück in die Grundstruktur und löst mit exit meine ich auch alle finally blöcke aus. Wenn prozedur1 auf prozedur2 mit goto verlinkt, dann mache ich aus dem goto einfach den aufruf der prozedur2 und schreibe dadrunter auch wieder exit. Also dürfte, wenn sich die am tiefsten veraschachtelte prozedur8 sich auflöst, alle anderen sich elegant mit auflösen, bis ich wieder in der grundstruktur bin, die prozedur1 startet.

Klappt das so und is ne gute Möglichkeit?

Lg
HenryHux Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 542
Erhaltene Danke: 33

Windows 7 Premium
Delphi XE, Eclipse
BeitragVerfasst: Do 18.11.10 18:12 
So, habe es komplett umgeschrieben wie oben erwähnt.
Klappt genauso wie vorher, nur ohne GoTo und der Speicher wächst nicht an. Sonst war er nach 10minuten auf 10mb, so nur auf 2 konstant.
Sehr gut =)
Habe aber wahscheinlich ersmtal mehr Bugs reingebracht.
Danke für den Anstoß :D

Lg