Form braucht zu lange zum laden

  • Allgemein

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von Andrejd1987.

    Form braucht zu lange zum laden

    Hallo erstmal
    Also ich habe eine Form die ich nur mit einem Icon in der Leiste sehe und per "ContextMenuStrip" etwas auswähle.

    mit diesem Menu öffne ich die "Form2" wo gewisse Daten anzeige wie z.b. Cpu und ram auslast mit 2 "PerformanceCounter" und andere Sachen.

    "ein paar panel´s sind auch dabei."

    wenn ich nun Form2 lade braucht sie ca. 5-6 sek.
    wenn ich Form2 close und dann wieder öffne kommt sie zuvor weil die daten im speicher sind

    meine frage dazu:
    1. wie kann ich das so machen das Form2 schon vorher geladen wird ?
    2. wäre es überhaupt besser es vorher laden zu lassen wegen dem unnützen speicher benutztung ?
    3. wenn ich es so belassen würde könnte ich das so machen das eine Progressbar den Fortschritt des ladens anzeigt und dann halt wirde per clos sich schließt ?
    4. würde es schneller laden wenn ich nicht mit 4-8 panel einen rahmen mache sondern mit GDI oder DirectX ?

    ich weiss, es sind 4 Fragen aber trotzdem bitte ich um Hilfe.

    mfg der liebe Andrejd ;)
    hm also es steht nur im load das drinne wo die Form2 starte wenn sie gestartet ist.

    Quellcode

    1. Dim nWorkingWidth As Integer
    2. Dim nWorkingHeight As Integer
    3. With Screen.PrimaryScreen.WorkingArea
    4. nWorkingWidth = .Width
    5. nWorkingHeight = .Height
    6. End With
    7. Me.Location = New Point(nWorkingWidth - Me.Width, System.Convert.ToInt16((nWorkingHeight / 2) - (Me.Height / 2)))

    der ganze rest steht im Timer
    aber das würde ja auch nicht schneller sein wenn ich das in einem extra sub haue ;)

    "picoflop" sagt ja das es an den performancecounter liegt, könnte das ja so machen das der Timer erst 1 sek später startet dann müsste ja die Form2 schneller laden oder ?

    edit: okay auch wenn ich für den Timer1 nen Timer vorsetzte das er versetzt lädt nen timer setzte lädt die Form auch nicht schneller.
    ungefähr so:

    Quellcode

    1. Sub timerstarten1()
    2. Timer2.Interval = 3000
    3. Timer2.Start()
    4. 'zeit läuft ab
    5. Timer2.Stop()
    6. Timer1.Start()
    7. End Sub


    mfg Andrejd

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

    Andrejd1987 schrieb:

    VB.NET-Quellcode

    1. Timer2.Stop()
    solltest Du inn die Timer2_Tick-Prozedur reinschreiben.
    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!
    ich habe das jetzt so gemacht

    Quellcode

    1. Private Sub Timer2_Tick() Handles Timer2.Tick
    2. Static intSekunden As Integer
    3. intSekunden = intSekunden + 1
    4. If intSekunden = 1 Then
    5. Timer1.Start()
    6. ausrichtung()
    7. End If
    8. End Sub

    funktioniert besser als das ander komischer weise.
    ausrichtung: das eine sub wo der code für ausrichtung am start ist.

    zwar dauert das laden immer noch so 3-4 sek. aber passt jetzt wenn es nicht anders geht ;)
    und ich weis nicht so richtig wie ich die Form2 schon vorher in den speicher laden könnte und das er dann einfach abruft ;)

    mfg Andrejd

    Andrejd1987 schrieb:

    VB.NET-Quellcode

    1. Private Sub Timer2_Tick() Handles Timer2.Tick
    2. Static intSekunden As Integer
    3. intSekunden = intSekunden + 1
    4. If intSekunden = 1 Then
    5. Timer1.Start()
    6. ausrichtung()
    7. End If
    8. End Sub
    funktioniert besser als das ander komischer weise.
    Da hast Du allerdings absolut nix gekonnt, und verstanden hast Du auch nix. :S
    Der erste Timer_Tick erfolgt ein Intervall nach Timer.Start.
    Wenn Du also beim 2. Timer_Tick-Event was starten willst, verdopple das Intervall und nimm das 1. Timer_Tick-Event:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    3. Timer1.Interval = 2000
    4. Timer1.Start()
    5. Debug.Print(DateTime.Now.ToLongTimeString)
    6. End Sub
    7. Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
    8. ausrichtung()
    9. Timer1.Stop()
    10. End Sub
    11. Private Sub ausrichtung()
    12. Debug.Print(DateTime.Now.ToLongTimeString)
    13. End Sub
    14. End Class
    Sieh Dir das Ausgabe-Fenster des Studios an.
    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!
    warum?
    so wie ich es mache starte Form2 in ca. 2-3 sek. dann nach ca. 1 sek. richtet sich die Form2 aus und der 1. Timer startet und macht seine Arbeit

    es war ja nur versuchsweise das die ausrichtung überhaupt paar sek. gemacht wird, wie ich das als erstes hatte gabs überhaupt keine verzögerung

    es war ja nur einen versuch den Timer1 und die ausrichtung verzögert zu machen das eventuell die Form dadurch schneller lädt, was ja leider nicht geklappt hat.

    mfg Andrejd
    Ich muss mich entschuldigen, ich hab eben erst gesehen, dass Du ja 2 Timer in Verwendung hast. Also
    Statt Timer1.Stop() muss da Timer2.Start() rein.

    VB.NET-Quellcode

    1. Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
    2. ausrichtung()
    3. Timer2.Start()
    4. End Sub
    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!
    Entschuldigung angenommen ;)
    hm du hast glaube übersehen das ich den Code vom Timer2 gepostet habe ;) und nicht vom Timer 1 ;)
    im Timer 1 ist der ganze Krimskrams für die Aktualisierung außer die Ausrichtung die ist ja in einem extra sub.
    ehm und der Timer2 ist für verzögerung da ;)

    und im load ist im Moment gar nix mehr drinne weil der Timer 2 automatisch startet ;)

    mfg Andrejd
    Vielleicht kannst Du mal den gesamten Code posten, ich denke, der hat noch etwas Optimierungsbedarf.
    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!
    Okay in Ordnung kann nix schaden ;)

    VB.NET-Quellcode

    1. Public Class Form2
    2. Private Sub Form2_Load() Handles MyBase.Load
    3. Me.Hide()
    4. Me.Show()
    5. End Sub
    6. Sub ausrichtung()
    7. Dim nWorkingWidth As Integer
    8. Dim nWorkingHeight As Integer
    9. With Screen.PrimaryScreen.WorkingArea
    10. nWorkingWidth = .Width
    11. nWorkingHeight = .Height
    12. End With
    13. 'MsgBox("tatsächlicher Arbeitsbereich: " & _
    14. ' nWorkingWidth.ToString & " x " & nWorkingHeight.ToString)
    15. Me.Location = New Point(nWorkingWidth - Me.Width, System.Convert.ToInt16((nWorkingHeight / 2) - (Me.Height / 2)))
    16. End Sub
    17. Private Sub Timer1_Tick() Handles Timer1.Tick
    18. Label3.Text = "Betriebsystem: " & My.Computer.Info.OSFullName
    19. DoubleBuffered = True
    20. Label4.Text = "Heute ist der: " + Now.ToLongDateString
    21. ProgressBar1.Value = System.Convert.ToInt16(PerformanceCounter1.NextValue)
    22. ProgressBar2.Value = System.Convert.ToInt16(PerformanceCounter2.NextValue)
    23. Label1.Text = "CPU: " & ProgressBar1.Value.ToString & " %"
    24. Dim nutzram As Double
    25. nutzram = (My.Computer.Info.TotalPhysicalMemory - My.Computer.Info.AvailablePhysicalMemory) / 1048576 / 1024
    26. Label2.Text = "RAM: " & FormatNumber(nutzram, 2) & " GB"
    27. End Sub
    28. Private Sub Timer2_Tick() Handles Timer2.Tick
    29. Static intSekunden As Integer
    30. intSekunden = intSekunden + 1
    31. If intSekunden = 1 Then
    32. Timer1.Start()
    33. ausrichtung()
    34. End If
    35. Timer2.Stop()
    36. End Sub
    37. End Class

    und die Form2 wird nur mit Form2.show() gestartet bzw. angezeigt ;)
    im moment gibts da noch nicht so viel hatte noch nicht für das Projekt die idee was ich sonst noch so einbauen könnte ;)

    mfg Andrejd

    Edit by ErfinderDesRades: Bitte VB-Tag richtig benutzen
    -->VB-Tag richtig eingefügt.

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

    Pack die Zeile

    VB.NET-Quellcode

    1. Static intSekunden As Integer
    aus der Prozedur in die Form.
    Wozu brauchst Du 2 Timer :?:
    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!
    Wozu brauchst Du 2 Timer :?:
    um eine verzögerung zu haben wann der Timer1 starte ;)


    Un wassisdas?

    Visual Basic Quellcode
    1
    2
    3
    4

    Private Sub Form2_Load() Handles MyBase.Load
    Me.Hide()
    Me.Show()
    End Sub



    Wie lange lädt es eigentlich, wennde beide Timer ganzngar off lässt?

    Ich hab keinen Plan zu PerformanceCounter, aber warum benötigst du 2 davon?

    Quellcode

    1. Me.Hide()
    2. Me.Show()

    für eine verzögerung das die Timer mehr zeit haben zum aufbauen

    zum laden mit

    Quellcode

    1. Me.Hide()
    2. Me.Show()
    braucht er ca. 8 sek.

    ohne länger hm ca. 10 sek. , komisch ich dachte es war weniger
    quasi nur die Form2 laden dauert 10 sek.
    hier mal ein Bild

    hmm ich hoffe das hat jetzt nix mit Zutun das ich 28 tabs beim Browser auf habe ;)
    ich werde mal absenden und dann wieder testen ;)

    edit: okay hat nix damit zutun ;) aber 10sek. sind mir irgendwie doch zu viel wenn nur die Form2 angezeigt werden soll.

    mfg Andrejd
    Ägypten?

    Tip: Drück deinen ganzen bisherigen Ansatz komplett in die Tonne und überleg dir WAS du genau machen willst und mit welchen Mitteln. .Hide .Show als "Pause"? Dürfte selbst in diesem Forum den Titel "Gurke des Monats" erreichen können. Und das will was heißen!
    Edit by ErfinderDesRades: --> unnötiges Vollzitat entfernt.

    doch nicht nur hide und show ;)
    der 2. Timer macht es ja auch, war ja alles versuchsweise ;)
    die Ansicht ist ja auch eher so als Testansicht zu sehen ;)

    mfg Andrejd

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

    Wie isn dein TimerInterval für die Abfrage der NextValue der PerformanceCounter? Bei MSDN wird geraten, dies nur 1x je Sekunde zu tun, damit er Zeit für die Abfrage bekömmt. Ansonsten kann es natürlich sein, dasser deine GUI blockiert, weil er ruckizucki 1238 Abfragen in der Warteschleife hat.
    Auch sind einige Sachen bestimmt nicht im Timer auf die Labels auszugeben. Dein Betriebssystem wird z.B. während Runtime gleich bleiben...

    Fiel Fergnügen

    Vatter
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup:
    Edit by ErfinderDesRades: --> unnötiges Vollzitat entfernt.

    ja stimmt haste recht mit dem Betriebssystem ;)
    der Intervall von Timer 1 ist auf 600, und wenn ich ihn auf 1000 mache hat das kein Einfluss und wie gesagt war bei den Test´s die Timer aus weil ich ja nur die Form laden wollte ;)

    mfg Andrejd

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