Form aus Sub Main starten

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von loeffel.

    Form aus Sub Main starten

    Hallo,

    also ich weiß wie man ein Form aus der Main-Prozedur startet, aber ist das wirklich nur zum starten?
    Oder hat man noch bestimmte Vorteile bzw. andere Möglichkeiten?

    VB.NET-Quellcode

    1. Module ModuleStart
    2. Sub Main()
    3. Application.EnableVisualStyles()
    4. Using startfrm As New Form1
    5. Application.Run(startfrm)
    6. End Using
    7. End Sub
    8. End Module

    Wenn ich statt Application.Run .Show verwende dann läuft die Main Prozedur weiter. Kann man das eventuell nutzen? Die Main macht quasi die Hauptaufgaben und wirft nur ein Form zur Anzeige aus.
    Wie lasse ich die parallel laufen? Ich habe ein bissel rumexperimentiert. Ich habe ins Form.Shown Event eine Endlosschleife gepackt. Trotzdem läuft die Main bis zum Ende und die Anwendung schließt einfach wieder. Wenn ich auch eine Endlosschleife in der Main habe, dann wird aber nie der erste Schritt ausgeführt. Also einmal gewinnt das Form und einmal gewinnt die Sub Main, aber warum?

    VB.NET-Quellcode

    1. Module ModuleStart
    2. Sub Main()
    3. Application.EnableVisualStyles()
    4. Dim starfrm As New Form1
    5. starfrm.Show()
    6. While True
    7. Threading.Thread.Sleep(3000)
    8. MessageBox.Show("E")
    9. End While
    10. End Sub
    11. End Module
    12. Public Class Form1
    13. Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles Me.Shown
    14. While True
    15. Threading.Thread.Sleep(5000)
    16. MessageBox.Show("T")
    17. End While
    18. End Sub
    19. End Class


    Viele Grüße
    Das Form-Anzeigen hat eine gewisse Verzögerung. Der FormLoad-EventHandler wird erreicht, der Shown-EventHandler nicht.
    Wenn das mit der doppelten Endlosschleife probiert wird, hängt das Programm in der Main-Endlosschleife fest, bevor es beendet wird. Aber immer noch wird der Shown-EventHandler nicht erreicht. Da man die Main-Methode nicht mit Async modifizieren kann, wirst Du das wohl auch nicht schaffen können.

    btw: Sowas mit Sub Main und Form hab ich mal vor ner Weile versucht anzugehen: WinForms Projektentwicklung bzgl. der Rolle des Formulars, Punkt 4.2 Passivform und Stufe 4.3 - MVP PluginForm
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    @Haudruferzappeltnoch Das Application.Run() tickt anders.
    Probier mal ohne Using:

    VB.NET-Quellcode

    1. Module ModuleStart
    2. Sub Main()
    3. Application.EnableVisualStyles()
    4. Application.Run(New Form1)
    5. End Sub
    6. End Module
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hm. Habe ein WinForms-.NET-FX 4.8 Projekt und Deinen Snippet#2-Code aus Post#1. Das schafft es aber nicht in den Shown-EventHandler.
    Ich korrigiere. Wenn ich lange genug warte, geht es schon. Aber die E-MessageBoxen aus der Main kommen nie. Trotzdem ist die E-MessageBox-Codezeile Bedingung, dass die T-MessageBoxen kommen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Haudruferzappeltnoch schrieb:

    also ich weiß wie man ein Form aus der Main-Prozedur startet, aber ist das wirklich nur zum starten?
    Oder hat man noch bestimmte Vorteile bzw. andere Möglichkeiten?
    Jo, ein bischen was: AnwendungsFramework deaktivieren
    Also eine MainForm-Selection kann man haben, einen SplashScreen, und einen globalen TryCatch.
    Und Pre-Start-Data-Loading.

    Weitere Benefits wüsste ich grad nicht. Das meisste kriegt man auch (weniger elegant) mit AnwendungsFramework hin - aber nicht die MainForm-Selection.
    (Denkbar wäre auch, eine Datenbank-Voraauswahl zu basteln, oder vielleicht die Sprach-Einstellung...)

    Nach dem Öffnen des MainForms noch in der Main-Sub weiterzumachen scheint mir nicht sinnvoll. Da muss man ja iwann den mainSub-Thread anhalten, damit das Form nicht zu geht.
    Da bin ich nicht so für, Threads am Leben zu halten, die nix tun - das überlasse ich dann lieber dem Application.Run()
    Schaut mal hier, das zeigt das Anwendungsframework hinter den Kulissen, und ist in diesem Zusammenhang vielleicht ganz hilfreich:
    https://devblogs.microsoft.com/dotnet/update-to-winforms-vb-appframework/

    Wir haben hier in .NET Core einige neue Events eingefuehrt, insbesondere um HighDPI-Darstellungen aller Forms vor dem eigentlichen Appstart einzustellen.

    Darueberhinaus:
    Jedes Form benoetigt eine innere Nachrichtenverarbeitungswarteschleife (Windows Message Loop), in dem auf Windows Nachrichten geprueft wird, die werden dann verarbeitet, dann werden die entsprechenden Onxxx Methoden aufgerufen, und die wiederum loesen dann die eigentlichen Ereignisse wie beispielsweise Click oder DoubleClick aus. Wenn man ein Form an Application.Run uebergibt, wird die Nachrichtenwarteschleife korrekt eingerichtet, sodass die Events auch "passieren".

    In dem oben beschriebenen Fall laeuft nichts parallel. Das Formular wird aufgerufen und steht da, und dann laeuft deine Main-Schleife. Aber nicht die Warteschleife.
    Wenn du Dinge in deiner App parallelisieren moechtest, kannst du beispielsweise den Background Worker als einfachste Loesung verwenden - besser, aber etwas aufwaendiger ist es aber, mit Tasks, Await und Async zu arbeiten.

    Hope that helps,

    Gruss

    Klaus