Schleife zu schnell | Invoke und Delegat

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von Eistee.

    Schleife zu schnell | Invoke und Delegat

    Hallo erstmal,

    ich hab da ein kleines Problem mit meinem Code den ich umschreibe muss nur ich weiß noch nicht ganz wie.
    Ich erzeuge in einem Sub Werte mit Random und verarbeite diese dann in einer Schleife direkt.
    Das Problem dabei ist das die Schleife alles zu schnell abarbeitet.

    Wie könnte ich das am simpelsten steuern,
    also wie lange die Schleife "pro runde" braucht?

    Mein Poseudo Code:

    VB.NET-Quellcode

    1. Sub
    2. Random zahl1
    3. Wenn Random zahl1 ist blabla dann
    4. Random zahl2
    5. sonst
    6. Random zahl3
    7. Ende
    8. Random zahl3
    9. Wenn sonst blablablubb..
    10. noch zwei sachen
    11. Wenn das dann
    12. For
    13. "Create"
    14. Next
    15. Sonst
    16. For
    17. "Create"
    18. Next
    19. Ende


    Was ich damit verdeutlichen will ist alle Schritte bis zur Schleife müssen durchlaufen werden bevor die Schleife startet.
    Habe es schon mit Thread Sleep versucht aber das geht garnicht (hängt die Darstellung auf die mit "Create" erzeugt wird).

    Weiß jemand rat?

    Gruß Eistee

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Eistee“ ()

    Also meiner Meinung nach gibt es da keine Zeit Probleme.
    Alle Befehle werden in einer Sub der reihe nach abgearbeitet. Da nirgens zu erkennen das du auf einen Response warten müsstest.

    Ich denke der fehler liegt woanders.
    Hi!
    Pseudocode zur Verdeutlichung einer Lösung habe ich schon öfters gesehen. Aber Pseudocode, um uns dein Problem zu schildern... alle Achtung.

    Es ist für mich nicht mal ansatzweise zu verstehen, was du hier versuchst...
    Versuchst du eine Art Spielzug zu programmieren, der zu schnell abläuft? Dann setze deine Anweisungen in einen Timer.
    Gibt es Probleme mit den erzeugten Zufallszahlen? Dann zeig uns den Code, der diese Zahlen erzeugt (komplett).

    Grüsse, der_Kurt
    Ok das ganze leuft ohne fehler nur es ist zu schnell..

    Hier mal der Ganze Code:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Buildlevel()
    2. 'Random
    3. TopLevelx = Rnd1.Next(10, 200) '60
    4. 'Ziel wird gesetzt + Modolo
    5. If TopLevelx <= 125 Then
    6. Ziel = Rnd1.Next(130, 180)
    7. RestZiel = Ziel Mod 2
    8. If RestZiel <> 0 Then
    9. Ziel = Ziel - 1
    10. End If
    11. Else
    12. Ziel = Rnd1.Next(10, 110)
    13. RestZiel = Ziel Mod 2
    14. If RestZiel <> 0 Then
    15. Ziel = Ziel - 1
    16. End If
    17. End If
    18. 'Stufe wird erzeugt
    19. Stufengröße = Rnd1.Next(2, 20)
    20. RestStufengröße = Stufengröße Mod 2
    21. If RestStufengröße <> 0 Then
    22. Stufengröße = Stufengröße - 1
    23. End If
    24. O20.Top = TopLevelx
    25. O20.Height = Höhe
    26. 'Runter in Stufen
    27. If TopLevelx < Ziel Then
    28. For i = TopLevelx To Ziel Step Stufengröße
    29. O20.Top = O20.Top + Stufengröße
    30. Call CreateLevel()
    31. Next
    32. End If
    33. 'Hoch in Stufen
    34. If Ziel < TopLevelx Then
    35. For i = Ziel To TopLevelx Step Stufengröße
    36. O20.Top = O20.Top - Stufengröße
    37. Call CreateLevel()
    38. Next
    39. End If
    40. End Sub


    Die geschwindigkeit der letzten beiden Schleifen (wo immer nur eine laufen kann wegen dem if) sollte ich irgentwie festlegen können aber OHNE das das Programm einschläft.
    Ich habe versucht den geposteten Code ein einem Extra Thread abzukapseln
    und diesen dann einschlafen zu lassen aber irgendwie will das nicht klappen.

    Habe mir das im Internet angesehen und es sieht jetzt so aus:

    VB.NET-Quellcode

    1. Imports System.Threading
    2. Dim A As Thread = New Thread(AddressOf Buildlevel)
    3. Private Sub Buildlevel()
    4. For i = Ziel To TopLevelx Step Stufengröße
    5. O20.Top = O20.Top - Stufengröße
    6. Thread.Sleep(300)
    7. Call CreateLevel()
    8. Next
    9. End Sub


    Aber irgendwie hängt sich immernoch das Gesamte Programm auf wobei ja nur "Sub Buildlevel()" einschlafen soll.
    Kann mir jemand sagen wie das richtig geht?
    Rufst du Buildlevel() direkt auf?
    -> Dann ist das das Problem. Du musst den thread mit Thread.Start() starten.

    PS: In Threads, die nicht der GUI-Thread sind, darf man niemals auf Controls zugreifen!!!

    Viele Grüße, Phil.
    Ach dafür ist Delegate gut ?!
    Hab das mal gelesen und wollte das mir auch mal anschauen.. passt ja.

    habe mir den MSDN Eintrag angesehen aber irgentwie komm ich einfach nicht hinter die richtige strucktur (syntax)


    Ich versuche von O20(Panel) die Top Eigenschaft zu ändern. Mein Code besteht jetzt aus folgendem:

    VB.NET-Quellcode

    1. Public Delegate Sub Top_Ändern_Delegate(ByVal zahl As Integer)
    2. Public Sub Top_Ändern_Ausführen(ByVal zahl2 As Integer)
    3. O20.Top = zahl2
    4. End Sub
    5. Public Sub Top_Ändern(ByVal zahl As Integer)
    6. O20.Invoke(New Top_Ändern_Delegate(AddressOf Top_Ändern_Ausführen,zahl)
    7. End Sub


    Aufgerufen wird alles im "nicht Main Thread" so:

    VB.NET-Quellcode

    1. O20.Invoke(Top_Ändern(TopLevelx))


    TopLevelx ist der Wert den O20.Top erhalten soll.
    Hoffe ihr könnt mir dazu die *richtige* "syntax" posten oder mir sagen wo ich was ändern sollte.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Eistee“ ()