ERLEDIGT
NEIN
NEIN
ANTWORTEN
12
12
ZUGRIFFE
338
338
EMPFEHLEN
-
10.06.10 11:23 #1
Ich würde ein Programm gerne per Telnet steuerbar machen. Zuerst kommt der Login, dann ein Menü, je nach dem Punkt ein weiteres Untermenü (oder disconnect) usw.
Jedes dieser Dinge würde ich gerne in eine eigene Methode setzen. Jetzt habe ich aber Angst, das wenn man es oft benutzt und/oder mehrere Tage lang verbunden bleibt ihm irgendwann der Stack ausgeht. (Stack Overflow).
Deshalb habe ich mich gefragt, ob es möglich ist, wenn man wieder in einer Methode landet in der man schon war (wie z. B. das Startmenü) man alle Stackeinträge dazwischen entfernen kann.
Eine andere Möglichkeit, die mir gerade jetzt beim schreiben eingefallen ist, wäre es jeden neuen Methodenaufruf in einen neuen Thread zu machen. Aber würdet ihr das für klug halten?Mein kleiner webstart Projektplaner:
http://178.77.101.236/ppws/
Ideen, Verbesserungsvorschläge, Bugsmeldungen und allg. Kritik erwünscht und erbeten.
Danke. :)
-
10.06.10 11:27 #2
- Registriert seit
- Jun 2007
- Ort
- Passau (Niederbayern)
- Beiträge
- 1.394
Hallo,
also von Threads würde ich abraten, da das ne Menge Overhead ist, und das zusammenführen dann am Ende sehr schwer ist.
Ich würde eher zu einem Vector raten, der den "Weg" des Benutzers speichert. Sobald er zurückgeht, wird das letzte Element gelöscht. Dies entspricht auch deiner ersten Idee
Gruß
BKÜber eine gute Bewertung freut sich jeder ;)
Bitte erledigte Threads als "Erledigt" markieren.
"Though a program be but three lines long, someday it will have to be maintained.''
-- Geoffrey James, "The Tao of Programming"
-
10.06.10 11:57 #3
Danke, wobei ich denke, das sich dafür ein Stack besser eignet.
Aber es löst nicht mein eigendliches Problem. Hier ein Hardcodet-VHIDT-Pseudocode zum verstehen:
Code java:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
String LINE_WRAPPLER = System.getProperty("line.separator"); public static void login() { String username; String password; do { write("Username:" + LINE_WRAPPLER") username = read(); write(LINE_WRAPPLER + "Password:" + LINE_WRAPPLER") password = read(); } while(!loginCorrect(username, password)); menu(); } public static void menu() { write("0) Do Something"+ LINE_WRAPPLER); write("1) Do Something other" + LINE_WRAPPLER); write("2) Go Back" + LINE_WRAPPLER); byte input = -1; do { byte dummyInput; try { dummyInput = Integer.parseInt(read()); if(dummyInput => 0 && dummyInput <= 2) input = dummyInput; } catch(NumberFormatException e) {} } while(input == -1); if(input == 0) { } else if(input == 1) { } else if(input == 2) { login(); } }
Also rufen sie die Methoden gegenseitig auf. Damit werden die Aufrufe irgendwann so gestapelt sein, das der Stacktrace keinen Platz mehr hat. Threads würden dafür sorgen, das zumindest die Methode (wie hier am Anfang "login()") nicht beim Aufruf von "menu()" wartet und dadurch im Trace vermerkt wird, sonst fertig abgearbeitet wird.Mein kleiner webstart Projektplaner:
http://178.77.101.236/ppws/
Ideen, Verbesserungsvorschläge, Bugsmeldungen und allg. Kritik erwünscht und erbeten.
Danke. :)
-
Hallo,
ich verstehe gerade dein Problem nicht. Warum sollte dem Nutzer der Stack ausgehen, nur weil er mehrere Tage verbunden war?
Auf dem Stack landet ja zum großteil nur die Methoden die gerade ausgeführt werden. Sobald diese beendet werden, verschwindet das alles wieder vom Stack.
Aber zum Speichern der ausgeführten Actions schau die mal das Command-Pattern an.
http://de.wikipedia.org/wiki/Kommando_(Entwurfsmuster)
Gruß
SaschaEs ist schwer Allwissend zu sein. Aber ich komme damit klar. ;-)
-
10.06.10 12:12 #5
Ja, das war falsch ausgedrückt. Natürlich nicht durch die Verbindung, sondern der Benutzung. (Sobald man nichtmehr verbunden ist soll read() eine IOException bis ganz nach oben throwen, dadurch ist der Stack wieder größtenteils leer.)
Wenn er sich in meinen Beispiel Authentifiziert, das Menü angezeigt wird und er wieder zurückgeht landet trotzdem immer mehr darauf, weil die Methoden ja verschachtelt sind. Damit sammelt sich mit jeder Aktion mehr an, bis der User disconnected und er per throw zurückgeht. (Oder ihm eben der Platz ausgeht.)Mein kleiner webstart Projektplaner:
http://178.77.101.236/ppws/
Ideen, Verbesserungsvorschläge, Bugsmeldungen und allg. Kritik erwünscht und erbeten.
Danke. :)
-
Also wird bei dir nie eine Methode beendet, bis man disconnected ist? Das wäre aber ein schlechtes Konzept. Das würde heißen, wenn man viel arbeitet, würde der Stack voll laufen.
Das kann ich mir gar nicht vorstellen, dass du das so implementiert hast.
Wenn der User eine Aktion ausführt, muss die Methode doch beendet werden.
Gruß
SaschaEs ist schwer Allwissend zu sein. Aber ich komme damit klar. ;-)
-
10.06.10 12:55 #7
- Registriert seit
- Jun 2007
- Ort
- Passau (Niederbayern)
- Beiträge
- 1.394
Hi,
anstatt deines Aufrufes der menu()-Methode in Zeile 16 könntest du auch ein einfaches return schreiben.
Dann musst du aber in der main() noch eine Schleife machen, so dass die Abfrage erneut angezeigt wird.
Gruß
BKÜber eine gute Bewertung freut sich jeder ;)
Bitte erledigte Threads als "Erledigt" markieren.
"Though a program be but three lines long, someday it will have to be maintained.''
-- Geoffrey James, "The Tao of Programming"
-
10.06.10 13:17 #8
Ja, aber da jede Aktion ja eine eigene Methode hat, muss die Aktion die Folgeaktion aufrufen, wodurch die ursprüngliche Aktion an der Aufrufstelle "stehenbleibt", wärend die darunter aufgerufene (usw..) abgearbeitet wird.
Würde ich in Zeile 16 ein return machen (ich gehe jetzt davon aus, das du angenommen hast, das das Menü vor dem Login angezeigt wird), würde er in Zeile 50 weiter abarbeiten (vom Code her, wies genau gemacht wird weiß ich nicht.), ich würde aber das Menü ohne erneuten Aufruf der Methode nichtmehr angezeigt bekommen.Mein kleiner webstart Projektplaner:
http://178.77.101.236/ppws/
Ideen, Verbesserungsvorschläge, Bugsmeldungen und allg. Kritik erwünscht und erbeten.
Danke. :)
-
10.06.10 13:19 #9
- Registriert seit
- Jun 2007
- Ort
- Passau (Niederbayern)
- Beiträge
- 1.394
Deshalb hab ich ja auch noch geschrieben, dass du eine Schleife brauchst

// Edit: eine andere Möglichkeit wäre eventuell das Werfen von Exceptions. Angenommen, du wirfst eine BackToMenuException (musst halt schnell selber machen), dann wird die innerhalb der menu() abgefangen und sorgt dafür, dass die Methode erneut durchläuft. Du musst halt die Exceptions von Throwable erben lassen, sonst musst du bei jeder Methode einen ewig langen "throws"-Teil mit allen möglichen Exceptions anhängen
Gruß
BKGeändert von Bratkartoffel (10.06.10 um 13:22 Uhr)
Über eine gute Bewertung freut sich jeder ;)
Bitte erledigte Threads als "Erledigt" markieren.
"Though a program be but three lines long, someday it will have to be maintained.''
-- Geoffrey James, "The Tao of Programming"
-
10.06.10 13:31 #10
Exceptions müssen doch sowieso von Throwable erben, oder? (Zumindest indirekt.)
Aber wenn sich hinter den Menüpunkt "Do Something" im Beispiel z. B. ein anderes Menü verbergen würde, und dieses wieder eines aufrufen würde, könnte man mit "return" ja nichtmehr einen Schritt nach hinten gehen, sondern würde immer zurück zum Anfang kommen. Die Schleife würde zwar neu starten, aber das wäre doch schon sehr nerfend.
Und würden eine solche Menge trys nicht den Code mehr oder weniger unleserlich machen?Mein kleiner webstart Projektplaner:
http://178.77.101.236/ppws/
Ideen, Verbesserungsvorschläge, Bugsmeldungen und allg. Kritik erwünscht und erbeten.
Danke. :)
-
10.06.10 14:09 #11
- Registriert seit
- Jun 2007
- Ort
- Passau (Niederbayern)
- Beiträge
- 1.394
Hallo,
der Vorteil der Exceptions wäre halt, dass du die abfangen kannst, wann und (fast) wo du willst. Und natürlich wären das (je nach Größe / Menüs des Programms) einige try-catch, das müsste man halt mal durchplanen. Aber ich denke, dass dies durchaus eine Option darstellen könnte.
Gruß
BKÜber eine gute Bewertung freut sich jeder ;)
Bitte erledigte Threads als "Erledigt" markieren.
"Though a program be but three lines long, someday it will have to be maintained.''
-- Geoffrey James, "The Tao of Programming"
-
Exceptions sind eigentlich dazu da um Fehler-Fälle darzustellen und nicht um ein Programm zu steuern.
Bevor du dir die Arbeit machst und dafür Exceptions einfallen lässt, solltest du eher dein Konzept überdenken.
Gruß
SaschaEs ist schwer Allwissend zu sein. Aber ich komme damit klar. ;-)
-
12.06.10 15:40 #13
Irgendwie peintlich, das mir die Idee erst vorhin gekommen ist, aber wie wäre es, wenn ich das ganze per Variable steuern würde?
Gemäß meinen Beispiels würde das dann ungefähr so aussehen:
Code java:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
public class HandleTelnetCon extends Thread { private static final String LINE_WRAPPLER = System.getProperty("line.separator"); private static final byte LOC_LOGIN = -128; private static final byte LOC_START_MENU = -127; private static final byte STANDART_LOC = LOC_LOGIN; private static final byte loc; public void run() { loc = STANDART_LOC; switch(loc) { case(lOC_LOGIN): login(); break; case(LOC_START_MENU): menu(); break; default: loc = STANDART_LOC; break; } public static void login() { String username; String password; write("Username:" + LINE_WRAPPLER) username = read(); write(LINE_WRAPPLER + "Password:" + LINE_WRAPPLER) password = read(); if(loginCorrect(username, password)) loc = LOC_MENU; } public static void menu() { write("0) Do Something"+ LINE_WRAPPLER); write("1) Do Something other" + LINE_WRAPPLER); write("2) Go Back" + LINE_WRAPPLER); try { byte input = Integer.parseInt(read()); if(input == 0) { } else if(input == 1) { } else if(input == 2) { loc = LOC_LOGIN; } } catch(NumberFormatException e) {} } }
Der Vorteil wäre, ich umgehe das Problem mit dem Stack, und erspaare mir Schleifen um nach Fehlerfällen zu testen.
Was haltet ihr davon?Mein kleiner webstart Projektplaner:
http://178.77.101.236/ppws/
Ideen, Verbesserungsvorschläge, Bugsmeldungen und allg. Kritik erwünscht und erbeten.
Danke. :)
Ähnliche Themen
-
Richtige Syntax bei Operatorüberladung, wann sind "friend", "const", "&" nötig?
Von mrs_schokokeks im Forum C/C++Antworten: 4Letzter Beitrag: 25.08.10, 19:13 -
Eingabe in der timeline: "time*100" - bei Effekt "turbulentes Versetzen"-"Evolution"
Von MTMonline im Forum Videoschnitt, Videotechnik & -produktionAntworten: 2Letzter Beitrag: 25.04.08, 09:49 -
Fragen-paket: "SetInterval", "delete onEnterFrame", "for" UND etc ..
Von Leugim im Forum Flash PlattformAntworten: 4Letzter Beitrag: 10.10.05, 23:35 -
Finder methods + JBoss + Was expecting one of: "CONCAT" "SUBSTRING" ... "(" ... <STRI
Von cengizhdde im Forum Enterprise Java (JEE, J2EE, Spring & Co.)Antworten: 6Letzter Beitrag: 27.05.05, 15:29 -
Datei-Eigenschaften: "erstellt:","Geändert am", "Letzter Zugriff:"
Von KILLSMAKER im Forum C/C++Antworten: 2Letzter Beitrag: 19.05.05, 19:51





Zitieren


Login





