Laden...

Forenbeiträge von Seikilos Ingesamt 753 Beiträge

17.11.2007 - 10:23 Uhr

Wir haben definitiv ein anderes Niveau 🙂

Also für mich ist dies nicht klar, da in meinem Beispiel doch BaumSuche 11 mal aufgerufen wird, dh der Zähler ist dann 11, aber der Baum ist doch nur 4 Ebenen tief?
Deine/eure Tiefe ist die Anzahl der besuchten Knoten, ich meine die Anzahl der Ebenen

17.11.2007 - 10:17 Uhr

Die Prioritätensteuerung hat nur mit der wichtigkeit des Threads zutun, nicht mit der Feststellung seines Endes.

Warum würdest du ThreadStart.BeginInvoke nicht nutzen? Diese Methode bietet doch einen ansychronen Aufruf mit einem Callback, der gerufen wird, sobald Invoke (und damit mein Thread) fertig ist.

17.11.2007 - 10:13 Uhr

Ich bin beim Nachdenken auf eine interessante Frage gestoßen.
Wenn man einen Suchbaum mit Depth-First (also jeden Zweig bis nach unten hin, dann den nächsten) durchsucht, wie begrenzt man effektiv die Ebene, bis zu der der Algorithmus sucht?

Pseudo code:


BaumSuche(Knoten){
 TiefeErreicht() return

 ZweigListe <- erzeugeNachfolger(Knoten)
 
 für jeden Nachfolger N in Zweigliste
   BaumSuche(N)
}

Also man hat eine Abbruchbedingung die prüft, ob man eine bestimmte Tiefe erreicht hat. Aber wie inkrementiert man diesen Tiefenzähler so dass er tatsächlich nur die Ebenen zählt und nicht die Anzahl der besuchten Knoten?

                1
                |
           2----+----3
           |         |
         4-+-5     6-+-7
         |   |     |   |
         8   9     10  11

Hier gibt es also nur 4 Ebenen, aber egal wo man oben im Code eine Variable inkrementiert, man bekommt nur entweder die Aufrufe der Listen der Knoten(6) oder die Anzahl der Besuchten Knoten(11)

17.11.2007 - 09:53 Uhr

Dann müsste der Thread Events verwalten, gut dass lässt sich natürlich machen, aber im Grunde hab ich doch die Eventverwaltung + thread wenn ich bei dem ThreadStart ein BeginInvoke aufrufe und in der Methode, wie oben erwähnt die Priorität selber setze.
Oder gibt es hier einen Nachteil?

16.11.2007 - 21:22 Uhr

Oh, das war mir neu, es ist noch ungewohnt, dass eine Klasse nicht von Thread erben muss um Thread eigenschaften zu setzen.

Teste ich.

Danke!

16.11.2007 - 21:12 Uhr

Damit hab ich aber ein kleines Problem, async aufrufe sind genau das was ich suche. Denn bis jetzt hatte ich etwas in der Art:

ThreadStart s = new ThreadStart(obj.methode);
            t = new Thread(s);
            t.Priority = ThreadPriority.Highest;
            t.Start();

Nun hat ThreadStart in der Tat eine BeginInvoke Methode, was mich allerdings stört, ist dass es ein Hintergrundthread erzeugt, was ein Problem ist. Der subthread, der hier obj.methode ausführt muss ein Thread mit maximaler Priorität sein.
Leider find ich gerade keinen Weg etwas async auf einen Nicht-BG-Thread mit maximaler Priorität aufzurufen

16.11.2007 - 21:00 Uhr

Den Artikel und die PDF kenne ich, sitz da schon dran, gucke mir das mit den asynchronen Aufrufen an, danke 🙂

16.11.2007 - 20:53 Uhr

Achso, moment, beide Projekte sind eigenständige Projekte in einem Projektmappenverzeichnis. Hab dich wohl falsch verstanden, sie sind nicht beide in einer Projektmappe in VS geöffnet.

16.11.2007 - 20:49 Uhr

Der Titel ist vielleicht ein wenig falsch.
Ich hab einen GUI Thread, dieser erzeugt einen anderen Thread, beide laufen nun parallel. GUI braucht jedoch Daten von dem Subthread, muss also warten, bis dieser Beendet wird. Der Subthread benutzt keinerlei gemeinsame Ressourcen, dies ist also kein Problem. Der GUI Thread muss jedoch jeder Zeit Daten an den Subthread senden, daher kann ich nicht mit join arbeiten, weil dies mir die GUI lahmlegt.
Wie löst man dies am einfachsten? Ich würd auch gerne verhindern, alle paar Milisekunden zu gucken, ob der Subthread noch am leben ist.
Es gibt also keine kritischen Bereiche, daher wüsst ich auch Monitor oder Mutex nicht gescheit einzusetzen.

Am liebsten wäre mir eigentlich ein Thread.onFinish event...

16.11.2007 - 20:38 Uhr

Da hab ich geguckt, bei mir ist da kein Eintrag, obwohl das andere Projekt in der gleiche n Projektmappe ist

16.11.2007 - 20:08 Uhr

Ich hab ein paar Klasse in Projekt A und würde diese gerne unkompiliert in ein anderes Projekt linken, so dass ich die Klassen nutzen kann. Wenn ich "vorhandenes Element einfügen" mache, so bekomm ich aber eine Kopie der Klassen, gibt es ein weg die zu verbinden? Oder nur über den weg des Verweised der EXE von Projekt A in Projekt B ?

16.11.2007 - 15:53 Uhr

Ah, verflucht, richtig! Hab ich vergessen, nun hab ich mir schon eine eigene gebaut 🙂

Hat KVPair irgendwelche Vorteile gegenüber einer simplen <T1,T2> Klasse wo alle Attribute Public sind?

16.11.2007 - 15:48 Uhr

Naja, die Frage steht in der Überschrift 🙂

Und wenn nein, gibt es etwas, das genau das gleiche tut, nur anderd heißt? 😁

16.11.2007 - 00:07 Uhr

Na da hab ich ja das Problem, ob es eine List<T>, int[] oder sowas ist, ist ja wurscht, die for-schleife bekomm ich hin, interessant ist nur das Problem möglichst kompakt zu lösen, es klappt ja auch recht einfach, wenn man nicht immer von 0 iteriert, aber ich suche immer mehr als nur einen Lösungsweg, sonst steckt man in den gleichen Mustern fest.

16.11.2007 - 00:02 Uhr

Ne, sind keine Bits, die Felder können eigentlich jeden int Wert annehmen, dies war nur ein vereinfachtes Beispiel.

16.11.2007 - 00:00 Uhr

Bei mir ist der in der Express Version gesetzt. Was ich viel wichtiger finde ist das Detail, dass ich in Express keine Möglichkeit habe zwischen Debug und Release Build zu wählen, nicht dass ich die ganze Zeit Debug Builds auf Geschwindigkeit teste und keine Möglichkeit für ein Release habe.
Muss wohl die Final in Visual Studio kompilieren

15.11.2007 - 23:05 Uhr

Ich sitz seit über einem Tag an diesem Problem.
Ein 10 Elemente Array mit 0...


0|1|2|3|4|5|6|7|8|9 (Index)
0|0|0|0|0|0|0|0|0|0 (Werte)

(Ich visualisier das um leichter zu denken)

...soll nun einmal komplett kopiert und iteriert werden und einige Werte in eine 1 und andere im eine 2 zu ändern, dafür gibt es die zwei Parameter id und menge.
Id bestimmt ab welchem Wert +1 die Zahl 2 gesetzt wird.
Menge bestimmt wie oft die 2 gesetzt werden kann.
Es müssen immer genau die Anzahl 2en gesetzt werden, wie es die Menge beschreibt, dh wenn also die Iteration bei Index 9 ist und noch nicht alle 2en gesetzt hat, so müsste das ganze bei Index 0 weitergehen, ABER da ja Index 0 als erster dran war, hätte man da bereits die 2 setzten sollen.

Beispiel:
ID = 7
Menge = 3


0|1|2|3|4|5|6|7|8|9 (Index)
0|0|0|0|0|0|0|0|0|0 (Werte)
2|1|1|1|1|1|1|1|2|2 (Neus Array)

Man iteriert also von 0 nach 9 und setzt logisch gesehen 7 + 1, 7 + 2 und (7 + 3) % 10 auf 2, rest auf 1, nur dass der letzte Wert bereits als erster gesetzt werden müsste, da dort ja Idex 0 rauskommt.

Mir fällt ein Weg ein, ich kann erst bei der ID anfangen und immer ID+10 mal iterieren, dabei den Iterator aber immer %10 nehmen.
Ich frage mich nur, ob es auch klappt, wenn man von 0 bis 9 iteriert (reine Neugier)

15.11.2007 - 22:57 Uhr

Es hatte einen Grund, ich wollte einen Background Worker benutzen, wollte aber eine flexibele DoWork methode haben. Dh abhängig davon welchen Button ich drücke, sollte sich mal Methode A an den DoWork Event anhängen, mal Methode B. Der Buttonklick kann die Methode ja anmelden und den Worker starten, aber nicht abmelden, weil er ja parallel läuft. Ich kann es auch so lösen, dass ich mir den letzten Eventhandler merke(schätz ich)

15.11.2007 - 18:43 Uhr

Das letzte mal als ich so was gefragt habe, kam bei irgendwas mit IL Code rum, dass unsafe und Pointer langsamer sind, als safe und pointer 🙂

Ich such mal die Diskussion

Edit: Effizient aus Strings Lower/Upper Relation berechnen 🙂

15.11.2007 - 16:44 Uhr

Das mit dem int[] hab ich schon getestet 🙂

Das mit den Referenzen und Rückgabe weiß ich eigentlich, nur bring ich immer die Sprachen durcheinander...

Ich sollte wohl mal das Ding bauen und danach optimieren, wie bereits schon erwäht, hatte ich auch vor, aber hätte ja sein können dass Methode A viel besser als B wäre und da ich Methode B genommen habe(egal was Methode B ist 😁 ), hätte ich mich geärgert 🙂

14.11.2007 - 23:09 Uhr

Ich kenne Masken Anding aber können is was anderes. Werde es mir nochmal in Ruhe und mit klaren Kopf angucken 🙂

Danke

14.11.2007 - 20:16 Uhr

Schade, ich hab schon überlegt, ob es auf Bitebene mit Shifting was werden könnte, aber ich sehe da keinen Weg(mit meinem Wissen 😁 )

14.11.2007 - 20:01 Uhr

Ich denke gerade über das generieren von Zuständen nach. Wenn ich beispielsweise einen Startzustand
3,3,3,3,3 habe und valide neue Zustände 0,4,4,4,3 oder 3,0,4,4,4 sind, also einer der Werte wird auf 0 gesetzt und die dortige Zahl wird auf die Werte rechts davon verteilt, wenn es über den Index geht, dann fängt es wieder bei 0 an, also 4,3,0,4,4 , dies bekommt man nett mit Modulo hin. Aber als Weg für die Zustandsgeneration fällt mir nur eine doppelte for schleife ein. Man durchläuft jeden Wert, setzt den auf 0 und für den Wert dieser Stelle verteilt man mit der zweiten inneren for schleife (oder while...) den Wert auf die Stellen rechts.

Aber ist das alles? Mir fallen keine Alternativen ein und ohne Alternativen kann man so schlecht über die Möglichkeiten reflektieren. Möglich wäre auch eine andere Representation, aber es läuft alles auf zwei verschachtelte Schleifen hinaus.

14.11.2007 - 19:50 Uhr

Demnach macht es also keinen Unterschied, ob ich eine Objektvariable bearbeite oder eine lokale Variable erzeuge und zurückgebe, ich hoffe ich hab das richtig verstanden.

14.11.2007 - 18:35 Uhr

Ist das anders als in C++? Ich mein bei mir wird ein List<T> lokal in der Methode generiert und zurückgegeben und eine ref auf eine lokale Var ist doch nicht wirklich gut, oder? 🙂 Wird dann nicht kopiert?

Und was mir einfällt, wenn man Werte eines Arrays auf 0 checken will, so kenn ich zwei Methoden (ohne for schleife, weil array größe bekannt):
arr[0] == 0 && arr[1] == 0 && .... und
arr[0]+arr[1]+.. == 0

Ich kann mir keinen Rheim drauf machen, was davon besser sein könnte (auch nicht im ildasm 😄)

14.11.2007 - 18:26 Uhr

Aber da es reproduzierbar ist, lässt mich bezüglich meines Benchmarks hoffen 🙂

Interessant ist, dass bei mir bei geringen Iterationen von 1.000.000 mal die andere Methode schneller ist, könnt aber auch Messungenauigkeit sein, wer weiß.

Was mir gerade noch einfällt, sollte man bei der methode, die diese Liste zurückgibt eine Objekt var nutzen um das kopieren zu verhindern?

14.11.2007 - 17:36 Uhr

Sehr seltsam, sind immernoch ca 600 ms, hab Zwei Methode, die 1:1 sind, bis auf den zu testenden code, und das zwischengespeicherte ist schneller

14.11.2007 - 17:16 Uhr

Die Genauigkeit von dem Ding hab ich ja in dem anderen thread schon angezweifelt 🙂

Im Grunde ist es ja immer nur

Messung Start
viele Iterationen von einer Sache
Messung Stop

Messung Reset
Messung Start
viele Iterationen von einer anderen Sache
Messung Stop

Die Methode, die die List<T> zurück gibt generiert jedesmal 12 int[15] Einträge (nur zur Info)

Edit: Was müsste deiner Meinung nach dabei rumkommen? Beides gleich schnell?

14.11.2007 - 17:13 Uhr

Leider hatte ich schon die Erfahrung mit dem Ding und ich verstehe es kein Bisschen, vor allem weil ich das Gefühl habe, dass IL Code irgendwie nach mehr aussieht, als das was ich getippt habe.

Falls es jemanden interessiert (nur falls)
http://rafb.net/p/tjtFSv17.html

14.11.2007 - 16:42 Uhr

Ich hab gerade aus Spass mal so etwas getestet:


foreach( int[] r in methode()){
 // tu was;
}

und


List<int[]> tmp = methode();
foreach( int[] r in tmp){
 // tu was;
}

Das ist höchst faszinierend, die erste Variante ist 100 ms schneller als die zweite, erhöht man aber die iterationen der Snippets so geht die Zweite Version mit 500-1000 ms in Führung, ist also bei vielen iterationen besser, bei wenigen schlechter 🤔
Hat jemand eine Erklärung dafür? Das find ich höchst faszinierend

14.11.2007 - 15:48 Uhr

Original von Hajoseb
Schon mal etwas von CONST gehört 😄

Hab gerade ein bisschen gebenchmarkt, bei mir ist eine const Variable im Schnitt um 1/10 Sekunde langsamer als die nicht const Variante. Könnte dies an einem zusätzlichen const check liegen?

14.11.2007 - 14:51 Uhr

Ich hab leider bei dem Ding probleme, zu trennen was was ist. Ich find ja nicht mal die for schleife 😭

14.11.2007 - 14:20 Uhr

Ich hab mir in der Tat mit ildasm den IL code angeguckt, aber ich verstehe ihn leider nicht wirklich hinreichend

14.11.2007 - 12:59 Uhr

Ja sicher, das mit der Zeit verstehe ich, aber ich hab hab halt seltsame Werte, wenn ich zumbeispiel den ersten Test umschreibe, so dass result nicht extern deklariert wird, sondern jedesmal in der If bedingung selber, so ist die variante ein wenig schneller, trotz einer deklaration und das find ich seltsam...

Ich teste es mal in einem Thread.

Edit: Getestet, keine singifikanten Unterschiede (wobei ich immernoch nicht sicher bin, ob meine Methode annährend gut ist.

Denn dies:


for (int i = 0; i < 1000000000; i++)
            {
                if (a < i)
                {
                    int _result = i;
                }
                else
                {
                    int _result = a;
                }
            }

ist schneller, als dies:


int result = 0;
for (int i = 0; i < 1000000000; i++)
            {
                if (a < i)
                {
                    result = i;
                }else {
                    result = a;
                }
            }

Das find ich sehr seltsam, oder ist der compiler sooo gut?

Edit: Rasta: Nach meinem Test, aber wenn der Test müll ist, würd ich mein Leben nicht auf den ternären Operator ausrichten 😁

14.11.2007 - 12:40 Uhr

Oh, sorry 🙂 Ich teste nicht den Prozessor, sondern die Geschwindigkeit von if und dem Ternären Operator 🙂 (Hätte ich wohl erwähnen sollen)

In dem Fall ist zum Beispiel der Ternäre Operator fast doppelt so schnell, wie das If zeug, aber dass kann auch an der völlig falschen Benchmark methode liegen und daher der thread.

Der Test ist im eigenen Thread mit maximaler Priorität um ruhe vor dem UI thread zu haben (dacht ich mir), weil dort während des threads nichts getan wird.

Der Test läuft auf einem Singlecore

14.11.2007 - 12:32 Uhr

Achso, gut zu wissen, danke 🙂

14.11.2007 - 12:29 Uhr

Dann wirds also schwierig wenn ich Klassen habe, die ich nicht selber geschrieben habe, richtig? Die müssten schon ein Interface fürs komplette löschen anbieten?

14.11.2007 - 12:28 Uhr

Ich hab eine Verständnisfrage bezüglich solcher Tests in C#.

Ich hab einen kleinen Test gebastelt, nun gehe ich stark davon aus, dass ich eine Menge Fehler gemacht habe und wenn mir einer sagen kann, was bei so einem Test unbedingt zu beaachten ist, wär ich froh 🙂

Den folgenden Code las ich in einem eigenen Thread laufen und gebe die Werte einfach an den ui thread aus, mit deaktivierter crossthread überwachung


 Stopwatch s = new Stopwatch();
            int a = 500000;
            int result = 0;
            
            s.Start();

            for (int i = 0; i < 1000000000; i++)
            {
                if (a < i)
                {
                    result = i;
                }else {
                    result = a;
                }
            }
            s.Stop();

            s.Reset();

            s.Start();
            
            for (int i = 0; i < 1000000000; i++)
            {
                result = a<i?i:a;
            }

            s.Stop();

Der Thread hat höchste Priorität (ist kein Backgroundworker), aber gibts hier Probleme, die ich nicht sehe? Sollte so ein Test der jeweiligen Teile nie zusammen laufen?
(Ich geb die Zeiten natürlich aus)

14.11.2007 - 12:25 Uhr

Ne, war ja mein erster Versuch, da kommt dann
Fehler 1 Das Ereignis "Obj.MyEvent" kann nur links von += oder -= verwendet werden.

14.11.2007 - 12:06 Uhr

(Lustig, dass sich jedesmal die Balkenfarbe ändert 😁 wenn man einen Thread erstellt)

Wenn ich ein Objekt habe, bei dem ich events registrieren kann, gibt es dann einen weg, wie ich alle registrierten events löschen kann? Ich kann sicherlich mit -= und dann den expliziten Handler löschen, aber gibts einen Weg, alle einfach fallen zu lassen?
Sowas wie = null; oder so

13.11.2007 - 23:37 Uhr

Von OutOfBounds hab ich mehrmals gelesen, aber wo passiert das denn? Bei jedem Array zugriff?
Das ist doch wenn man das 13 von 12 Elemente lesen will, oder? Das müsste natürlich nicht vorkommen

13.11.2007 - 22:02 Uhr

Nein, CONST hab ich seit C++ erfolgreich verdrängt 🙂

Was ich mich gerade frage, wenn ich ein true oder false aus einer methode zurückbekomme, wie seht ist Int32 diesbezüglich optimiert? Wäre da ein int 0/1 return und check schneller als auf true/ false?
Oder ist das genauso schnell, weil boolean internern quasi ein Int mit einem bit ist?

13.11.2007 - 18:24 Uhr

Lese gerade, dass Properties, also Getter und Setter lahm sein können, wenn sie nicht inlined werden. Klar in einer Klasse selbst sollte man die var nutzen und nicht den getter und sie speichern, soweit möglich, aber gibt einen Weg Variablen zu holen, ohne sie Public zu machen und sicherstellen, dass die Performance nicht runtergeht?

Edit: Notiz an mich: Release build als Endversion einsetzen 😁

Edit2: Listy<T> besser als List wegen dem Boxing und Unboxing?

Edit3: Wenn ich ein Array mit 5 Elementen habe, so sollte ich nicht immer die Länge abfragen, sondern diese speichern, aber wenn es immer nur bsp. 5 sind, bietet es sich an, dies ohne Variablen sondern als Zahl überall zu implementieren, oder nimmt sich eine var mit nem int nicht viel?

13.11.2007 - 17:51 Uhr

Das hilft weiter 🙂

Danke euch beiden, mehr Infos sind natürlich immer willkommen, hab gerade noch das Buch Effective C# gefunden, aber ich komm an kein Exemplar in der Zeit, die ich habe 😠

Int32 ist doch Äquivalent zu int, oder?

Wenn man eine Unmenge an Größer/Kleiner Vergleichen machen muss, gibt es da eine schnellere Art als if(a<b) ?Oder wird dies durch den Compiler eh optimiert?

Und ist ein int[] einer List<int> vorzuziehen?

13.11.2007 - 17:34 Uhr

Hast du eine Begründung warum ich die generische Liste vor der normalen vorziehen sollte?

Zu dem "erst implementieren": Ich habe leider keine vergleich, es wird immer zulangsam sein, egal wie schnell ich es mache 🙂
Das ding soll eine Game AI werden, die in 3 Sekunden so tief wie möglich in einem Baum sucht, dabei tritt sie gegen eine anderen AI an und je schneller meine ist, desto besser ist sie 🙂

Btw, sind Backgroundworker eigentlich langsamer als Klassen die von Thread erben? Habs mal ohne Begründung gelesen, kann es aber nicht wieder finden

13.11.2007 - 16:37 Uhr

Ich hab ein Suchproblem für eine Minimax Aufgabe, bei der das Programm max. 3 Sekunden ackern soll und danach eine Lösung ausspucken muss 😁

Die Wahl viel auf C# und je effektiver das Programm ist, desto effektiver sucht es in der Zeit.
Deswegen würde ich gerne ein paar Infos sammeln (oder eine Diskussion) bezüglich einer möglichst optimalen Herangehensweise.

3 Sekunden wirken sich bei dem Problem nicht so sehr auf Speicher aus, als auf die Performance, dass bedeutet für mich, dass die Repräsentation des Problems maximale Effizienz Richtung Geschwindigkeit haben sollte und nicht auf den Speicher.

Gibt es für den Programmierpart wichtige Tipps? Es sieht ja so aus, als würden hier unzählige if-Bedingungen ausgewertet werden müssen und gibt es da was zu beachten? Schnellere Alternativen? Bit-Operationen? Keine Vector-Klassen sondern simple Arrays usw.

So Sachen wie möglichst nur Referenzen übergeben und kopieren von Variablen minimieren, wo es geht, sind mir soweit klar, aber man will ja immer was dazulernen 🙂

Edit: Beispielsweise brauch ich eine Liste von Zahlen, die aber nicht über 200 gehen, bietet sich dann ein Char Array an, oder doch Int mit zuvielen Bytes? Oder sogar floats? Arbeiten heutige CPUs nicht mittlerweile sogar besser mit floats? (Halbwissen, finde die Quelle gerade nicht)

11.11.2007 - 10:52 Uhr

Wahrscheinlich banal, aber was dir eventuell helfen könnte, die Evolution voran zu treiben ist ein Begriff aus der KI-Lehrere -> "genetische Algorithmen".
Wobei du wahrscheinlich darüber schon hinaus bist, naja einwerfen schadet nie 🙂

01.11.2007 - 17:48 Uhr

Hi,
mir ist es in der Tat nun wesendlich klarer geworden, ich hatte bis dato wohl auch ein falsch angelesenes Verständnis von MVC.
Jedenfalls bin ich mittlerweile der Meinung, das MVC kein gutes Architekturmuster ist um darauf das komplette System zu bauen.
Ich hab eher das Gefühl, als würde sich MVC sehr gut als Präsentationsschicht einer 3-Schichten-Architektur gut machen.
Was ich falsch im Kopf hatte, ist dass Controller die Applikationslogik ist, im Zusammenhang mit der GUI ist aber der Controller alles, was an Events vom View gefeuert wird.

Nun hoffe ich, dass ich alles im Kopf sortiert habe 🙂
Danke!

01.11.2007 - 15:30 Uhr

Was mir noch auffällt, MVC scheint irgendwie in alle Richtungen interpretiert zu werden.
Hab gerade ne Quelle, die definiert View = Ausgabe, Controller = Eingabe und Model = Verarbeitung.
Argh!
Und der Conroller wird als Eingabecontroller bezeichnet und ist nicht der Application Controller

01.11.2007 - 13:58 Uhr

Scheint logisch, ich kriegs nur in meinem Kopf zu keinem guten Bild. In einem anderen Problem muss man nach einem Menü zum Beispiel Passwort eingeben, das würde in deinem Konzept vorraussetzen dass Menüpunkt X zu Passworteingabe führt, aber View müsste dann explizit wissen, dass nach Punkt X ein Fenster "Passworteingabe" nötig ist, sehe ich das richtig?
Und es kann auch sein dass man nach einmal Passworteingabe nicht nochmal das Passwirt eingeben muss, aber dann müsste die View ja Dinge beachten wie validiert oder nicht, dafür müsste Sie ja die Logik kennen und dies erfragen.

Hier ist es für mich halt so, dass logischerweise die Logik bestimmen sollte, was nach einem Menüpunkt passiert, ob Passworteingabe oder nicht.