Form Sauberer laden

  • VB.NET
  • .NET (FX) 4.0

Es gibt 38 Antworten in diesem Thema. Der letzte Beitrag () ist von Facebamm.

    1. Der TE hat sich in diesem Thread noch viel zu wenig geäußert. @horstfh: Man könnte aufgrund von Post#8 vermuten, was Du geschlussfolgert hast, aber ich zumindest weiß immer noch nix, da sich der TE zu meinen Fragen in Post#9 noch nicht geäußert hat.
    2. @horstfh: bitte im Spoiler CodeTags verwenden.
    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.

    Pascalony schrieb:

    horstfh schrieb:
    Application.DoEvents()

    Das ist ein absolutes No-Go.

    horstfh schrieb:
    MsgBox(BTN.Text & " wurde geklicked!")

    Nicht so schlimm wie DoEvents() aber MessageBox wäre hier besser.


    Zunächst: Ich muss doch schmunzeln über die Bemerkung zu MsgBox. Diese Reaktion war zu erwarten.

    Warum sagst Du bei nur, was nicht geht bzw. dass das schlechter Code ist und nicht was Du anstelle dessen für Code vorschlagen würdest.
    Es ging mir bei meinem kleinen Programm nur darum zu zeigen, wie es gehen könnte.

    Zeige doch den besseren Code!!!
    Ich bin gespannt!
    Der Aufwand ist ja maximal 1 Stunde.

    Gruß
    Horst
    Zeitfressende Methoden (wie hier die Schleife) können in der Regel async Laufen. Aber halt nur, wenn keine Controls bzw. Deren Eigenschaften verändert werden müssen. Sonst müsste man da invoken, was wieder Zeit frisst. Dann behindert diese das restliche Laden der Form auch nicht.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen

    VB.NET-Quellcode

    1. Form.DoubleBuffered = True


    Das habe ich mir heute auch noch überlegt und könnte wirklich die Lösung sein.
    Das lässt sich im Eigenschaftenfenster unten rechts einfach einstellen.

    DoubleBuffered bedeutet, dass die Form zuerst Stück für Stück in einem zweiten Buffer gezeichnet wird.
    Erst wenn die Form vollständig gezeichnet ist, wird die Form in den Bildschirm-Buffer gezeichnet.
    Bei <Press Space> in den Sternenhimmel drückend...

    horstfh schrieb:

    Warum sagst Du bei nur, was nicht geht bzw. dass das schlechter Code ist und nicht was Du anstelle dessen für Code vorschlagen würdest.


    Ich habe meinen Lösungsvorschlag gemacht. Das ist mit Abstand die sauberste Lösung IMO.

    Pascalony schrieb:

    Wie @ThuCommix gesagt hat, wäre das Problem mit WPF zu lösen denke ich.


    Außerdem möchte ich nicht nur dem TE helfen, sondern auch anderen Leuten deren Code an manchen Stellen unsauber ist. Ich möchte dich nicht angreifen, sondern helfen. Ich dachte ich hätte das ausführlich begründet, falls nicht, kann ich nochmal genauer darauf eingehen. Du fragst warum ich keinen Code schicke? Erstens weiß ich nicht genau wie der Code des TE genau aussieht. Das heißt, wenn ich jetzt drauf los rate und etwas für ihn programmiere habe ich ggf. meine Zeit verschwendet, da es gar nicht zu seinem Code passt. Zweitens ist es hier allgemein das Ziel Leuten bei Problemen zu helfen und zwar so, dass sie etwas dabei lernen. Ich halte es nicht für sinnvoll einen ganzen Code und ggf. sogar noch Copy/Paste Code zu schreiben. Der Lerninhalt ist dadurch höher, dass der TE sich mit dem geschriebenen auseinandersetzten muss. Aber nochmal wie gesagt: ich möchte helfen und bin froh über jeden der hilft. Aber das heißt nicht, dass man nich die Lösung der Helfer verbessern oder kritisieren darf.

    @xX-Nick-Xx

    Vielleicht willst du ja mal erleuchten und den fürs Laden relevanten Code posten?
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Ich habe mir den Spaghetti-Code jetzt nicht näher angesehen, aber mir fielen ProgressBars und sonstiges Zeug in die Augen, die in irgendeiner Weise einen Fortschritt anzeigen sollten.
    Das Problem bei der ganzen Sache ist, dass du zeitaufwendigen Code synchron zum "Aufbau" der GUI ausführst und zwischendrin mit fragwürdigen Mitteln versuchst das Anzeigen der Form zu forcieren.
    Wenn du willst, dass der Benutzer ein vollständig gezeichnetes Fenster sieht und im Vordergrund eine Anzeige, die den Fortschritt deiner ressourcenintensiven Hintergrundaktivitäten visualisiert, dann solltest du im Internet und auch hier im Forum mit folgenden drei Stichworten auf jeden Fall weiterkommen:
    • Task Parallel Library (Stichwort: Async/Tasking)
    • Multithreading (Stichwort: Managed Threads -> System.Threading.Thread)
    • BackgroundWorker (habe den nie wirklich verwendet, habe aber häufiger mal Threads im Forum darüber gesehen -> weiß demnach nicht ob es sinnvoll bzw. performant ist)
    Der Grundgedanke ist, dass du dir hierfür neben dem GUI-Thread einen weiteren Thread hernimmst, der dann die (ressourcenintensive) Arbeit im Hintergrund verrichtet. Der kann dann auch (wie scheinbar gewollt) nach und nach seinen Fortschritt mitteilen und die Visualisierung an den GUI-Thread delegieren. Aufpassen muss man übrigens auch beim Progress-Reporting. Zu oft in der Sekunde seinen Fortschritt mitteilen (wie z.B. bei der Schleife, die Arbeit simulieren sollte) verlangsamt in der Regel den ganzen Prozess. Es ist zwar ein befriedigendes Gefühl wenn der Fortschrittsbalken schön geschmeidig durchläuft, aber blöd wenn dadurch die eigentliche Arbeit behindert wird.

    Im Übrigen, wenn der Programmstart tatsächlich gar nicht so aufwändig ist und es um rein ästhetische Aspekte geht (Ladebalken), dann nehme dir doch statt dem Form.Load-Event das Form.Shown-Event. Dann sollte der Benutzer die vollständige Form sehen, muss aber evtl. kurz warten bis deine Prozedur durchgelaufen ist.

    Mit Application.DoEvents() und Co. würde ich gar nicht erst anfangen, aber dazu haben ja meine Vorredner schon genug gesagt.
    Im LLoad Passiert nur das:

    VB.NET-Quellcode

    1. ​ Control.CheckForIllegalCrossThreadCalls = False
    2. If Not IO.Directory.Exists(Opath) Then
    3. ' Nein! Jetzt erstellen...
    4. Try
    5. IO.Directory.CreateDirectory(Opath)
    6. ' Ordner wurde korrekt erstellt!
    7. Catch ex As Exception
    8. ' Ordner wurde nich erstellt
    9. End Try
    10. End If
    11. NumericUpDown1.Enabled = False
    12. NumericUpDown2.Enabled = False
    13. NumericUpDown3.Enabled = False
    14. NumericUpDown4.Enabled = False
    15. NumericUpDown5.Enabled = False
    16. NumericUpDown6.Enabled = False
    17. NumericUpDown7.Enabled = False
    18. NumericUpDown8.Enabled = False
    19. NumericUpDown9.Enabled = False
    20. NumericUpDown10.Enabled = False
    21. NumericUpDown11.Enabled = False
    22. NumericUpDown12.Enabled = False
    23. NumericUpDown15.Enabled = False
    24. NumericUpDown14.Enabled = False
    25. NumericUpDown13.Enabled = False
    26. ComboBox1.Enabled = False
    27. Button8.Enabled = False
    28. TextBox3.Enabled = False
    29. TextBox2.Enabled = False
    30. TextBox4.Enabled = False
    31. If My.Settings.lang = "Deutsch / German" Then
    32. lang.ComboBox1.SelectedIndex = 0
    33. ComboBox3.SelectedIndex = 0
    34. Else
    35. lang.ComboBox1.SelectedIndex = 1
    36. ComboBox3.SelectedIndex = 1
    37. End If
    38. TextBox5.Text = My.Settings.lspath
    39. If My.Settings.lang = "Deutsch / German" Then
    40. Else
    41. Label36.Text = "Working speed:"
    42. Label44.Text = "Capacity per second:"
    43. Label43.Text = "Overloading capacity:"
    44. Label49.Text = "Working speed:"
    45. Label48.Text = "Capacity per second:"
    46. Label47.Text = "Overloading capacity:"
    47. 'Über numupdown
    48. Button15.Text = "Open selected link"
    49. Label19.Text = "Mod View"
    50. Label35.Text = "Change Mod"
    51. Label22.Text = "Capacity"
    52. Label31.Text = "Required pulling force"
    53. Label23.Text = "Fuel"
    54. Label30.Text = "Amount per hour"
    55. Label24.Text = "Price"
    56. Label29.Text = "Heavy"
    57. Label25.Text = "Speed"
    58. Label32.Text = "Normal"
    59. Label26.Text = "Price per day"
    60. Label33.Text = "Light"
    61. Label28.Text = "lifetime"
    62. 'seiten leiste
    63. Label7.Text = "Capacity: "
    64. Label8.Text = "Fuel: "
    65. Label6.Text = "Price: "
    66. 'Label9.Text = ""
    67. 'Label10.Text = ""
    68. Label11.Text = "Price per day"
    69. Label3.Text = "Category: "
    70. Label12.Text = "Lifetime: "
    71. Label17.Text = "Required pulling force: "
    72. Label13.Text = "Amount per hour:"
    73. Label14.Text = "Heavy: "
    74. Label15.Text = "Normal: "
    75. Label16.Text = "Light: "
    76. 'SaveButton
    77. Button8.Text = "Save"
    78. 'LoadButton
    79. Button7.Text = "Mod Add"
    80. 'Info labels
    81. Label27.Text = "(Please wait)"
    82. modselect.Text = "Mod selected"
    83. ifsave.Text = "Saved"
    84. ListView2.Columns(3).Text = "Current Version"
    85. Label46.Text = " Placeable objects"
    86. ' ListView2.Columns.Item(3).Text = "Current Version"
    87. End If

    Ich würde prinzipiell alles, was du im Designer machen kannst, auch im Designer tun. Trennung von Code und Design ist sinnvoll. Dadurch wäre das Load-Event nicht so überfüllt. Wenn du dein Programm auf verschiedenen Sprachen haben möchtest (so interpretiere ich das zumindest) geht das auch einfacher. Hierbei könnte das für dich interessant sein: Programme mehrsprachig erstellen

    xChRoNiKx schrieb:

    VB.NET-Quellcode
    Control.CheckForIllegalCrossThreadCalls = False

    Das solltest du am besten in den Müll schmeißen und es ordentlich machen mit Invoke´s.
    Und dann noch das was @Pascalony sagte.


    Bei euch weiß man manchmal echt nicht auf wem man hören soll xD

    Der eine sagt tu es rein der andere sagt das gegenteil :D :P

    Hi Ihr Coniferen,

    wisst Ihr eigentlich was Ihr da tut? Ihr wollt eine Programmiersprache, die einmal für Programmieranfänger entwickelt wurde, so komplizieren, dass kein Anfänger sich mehr traut auch nur eine Codezeile zu schreiben.
    Nein! Nein und nochmals nein!
    So könnt Ihr nur ein exclusiver Zirkel sein und keinen einzigen neuen Programmierer gewinnen.
    Es war doch gerade die Intention von Kemeny und Kurtz, dass Programmieren für Jederman möglich wurde.
    Wenn man Euch zuhört, ist es eher Euere Bemühen, jeden auszuschließen, der nicht mindestens ein Informatikstudium abgeschlossen hat.
    Wer 43 Codezeilen als " den Spaghetti-Code jetzt nicht näher angesehen" hat und dennoch kritisiert, den braucht keiner als Hilfe.

    Kehrt zurück zu den Roots.
    Kämpft dafür, dass jeder, "mal eben " ein kleines Programm schreiben kann, auch wenn er von der Materie nicht viel versteht. Es muss Spaß machen! Das ist die erste Prämisse.

    Machts gut!
    Horst
    @xX-Nick-Xx Wenn Du hier 13 NUDs und weitere Controls disablest und enablest, pack sie alle in ein gemeinsames Panel und disable dies in einer einzigen Zeile.
    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!

    r0tzi schrieb:


    was ist denn Modstudio? :)

    Habe ModStudio18 gegoogelt und diese Adresse gefunden:
    ls-modcompany.com/forum/thread…latest-update-23-08-2017/
    Da sieht man die Oberfläche, um die es geht!

    Das ist klar, wenn man so eine Oberfläche hat, dass die Zeit braucht, wenn die erst beom Start erstellt wird.
    Währe da nicht zusätzlich eine einführende Startseite besser ?
    Und xX-Nick-Xx, warum hast Du nicht direkt darauf hingewiesen?

    Gruß
    Horst

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „horstfh“ ()

    horstfh schrieb:

    Ihr wollt eine Programmiersprache, die einmal für Programmieranfänger entwickelt wurde, so komplizieren, dass kein Anfänger sich mehr traut auch nur eine Codezeile zu schreiben.


    Ähm im Gegenteil. Ich habe ihm gesagt, dass er 50% seines Codes im Designer machen kann. Das erleichtert es ihm sogar noch. Das Problem ist, dass er massive Probleme haben wird, wenn er nicht von Anfang an auf Type-safety achtet, schlechte Funktionen außen vorlässt etc. Diese Art zu programmieren kriegst du nie wieder raus. Deine Programme werden immer fehleranfällig sein. Ich hab genauso angefangen wie der TE auch, es hängt von deiner Lernbereitschaft ab, ob VB.NET schwer oder einfach ist. Niemand hier hat die Absicht jemanden auszuschließen und wir sind auch kein exklusiver Zirkel.

    horstfh schrieb:

    Ihr wollt eine Programmiersprache, die einmal für Programmieranfänger entwickelt wurde, so komplizieren, dass kein Anfänger sich mehr traut auch nur eine Codezeile zu schreiben.

    Niemand will hier irgendetwas kompliziert machen. Man meldet sich unter anderem in einem Forum an, damit einem geholfen wird. Es gibt gute und schlechte Hilfe.
    Unter schlechte Hilfe fällt bspw. das Posten von C&P Spaghetti-Code ohne jegliche Erläuterung der Semantik. Klar ist es schön, wenn das Problem gelöst zu sein scheint und das Programm auch funktioniert. In einem Forum ist es allerdings fatal, wenn fehlerbehaftete Lösungsansätze ohne weiteres stehen gelassen werden ohne Kommentar. Jemand anderes der den Beitrag findet übernimmt diese Fehler ebenfalls. Ein gutes Beispiel haben wir hier doch bereits. Das Abusing der Property ​CheckForIllegalCrossThreadCalls beispielsweise, kann zu unvorhersehbaren Problemen führen wenn dann tatsächlich mehrere Threads gleichzeitig auf das jeweilige Control zugreifen.

    horstfh schrieb:

    Wenn man Euch zuhört, ist es eher Euere Bemühen, jeden auszuschließen, der nicht mindestens ein Informatikstudium abgeschlossen hat.

    Ich denke da interpretierst du zu viel hinein. Hier wird niemand ausgeschlossen und versucht wird es mit Sicherheit auch nicht. Es wird ja niemand dazu gezwungen einen bestimmten Lösungsweg zu wählen. Es interessiert mich eigentlich auch überhaupt nicht, ob der TE sich 43 Zeilen Murks ohne sie verstanden zu haben (wie auch is ja keine vernünftige Erläuterung da) ins Clipboard packt oder ob er einen gutgemeinten Rat im Forum verfolgt. Mir ist es lediglich wichtig, dass noch im selben Thread mindestens ein Post vorhanden ist, der Fehler aufzeigt und somit tatsächlich Hilfe bietet. Unkommentierter Quellcode bringt in den aller seltensten Fällen etwas.

    horstfh schrieb:

    Wer 43 Codezeilen als " den Spaghetti-Code jetzt nicht näher angesehen" hat und dennoch kritisiert, den braucht keiner als Hilfe.

    Ich habe den Code überflogen und festgestellt, dass er nicht zu einem allgemein vertretbaren Ziel führt. Der Code ist weder kommentiert noch formatiert. Es gibt hier im Forum einen VB.NET-Tag für Syntax-Highlighting. Trotz mehrmaligem Erwähnen, dass der Tag verwendet werden sollte, hast du es nicht geschafft. Stört mich persönlich nicht, da ich den Code lesen und verstehen kann auch ohne Syntax-Highlighting und "besonderer" Formatierung, aber da du dich hier ja so doll für Anfänger einzusetzen scheinst, musste ich das mal erwähnen.

    horstfh schrieb:

    Kehrt zurück zu den Roots.

    Ich weiß nicht welche "Roots" du kennst, aber wenn das bedeuten würde, dass man schlechte Hilfe der guten Hilfe vorzieht, dann kann ich dir auch hier nicht zustimmen.

    Wenn du dir meinen Beitrag genau durchgelesen hättest, würdest du verstehen wieso ich "dennoch kritisiert" habe.

    Grüße Tim
    Jetzt wo ich Deinen Code sehe...
    Es macht keinen Sinn, den Controls welche Startwerte zum initialisieren zu geben, die Du kurz darauf wieder im Code änderst.
    Da brauchst Du dich auch nicht zu fragen, warum das Laden so lange dauert.

    Ich kann mir nur der Meinung von Pascalony anschliessen:
    Ich würde prinzipiell alles, was du im Designer machen kannst, auch im Designer tun.
    Bei <Press Space> in den Sternenhimmel drückend...
    Im voraus sry, wenn ich das Problem nicht richtig erfasst habe (war zu faul alles zu lesen)

    ich denke mal das problem liegt daran das noch nicht alles gezeichnet ist und du schon wieder etwas neu zeichnen möchtes via Processbar.
    Hier ist mal die reinfolge der Events.
    Control.HandleCreated
    Control.BindingContextChanged
    Form.Load
    Control.VisibleChanged
    Form.Activated
    Form.Shown

    und dort liegt das Problem, Control.VisibleChanged wird erst nach dem Load aufgerufen. Das bedeutet deine Controls sind noch nicht sichtbar (Transparent) und durch optimierung wird dort auch keine From gezeichnet:D