Do Loop um das doppelte verlangsamen?

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

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

    Do Loop um das doppelte verlangsamen?

    Guten Abend,

    es ist eine sehr simple Frage, aber eine Antwort finde ich hierzu nicht. Ich habe mich schon durch so viel durchgeackert und ich finde einfach nichts. Bei Thread.Sleep bleibt meine Form hängen, meine ResponsiveSleep Funktion kommt nicht unter 200ms und mein Kopf macht bum.

    VB.NET-Quellcode

    1. ​Do
    2. Zahl += 1
    3. Loop Until Zahl = 500


    So sieht der Code aus. Die ResponsiveSleep Funktion die ich meine, ist diese:

    VB.NET-Quellcode

    1. #Region "Responsive Sleep"
    2. Public Sub ResponsiveSleep(ByRef iMilliSeconds As Integer)
    3. Dim i As Integer, iHalfSeconds As Integer = iMilliSeconds / 500
    4. For i = 1 To iHalfSeconds
    5. Threading.Thread.Sleep(500) : Application.DoEvents()
    6. Next i
    7. End Sub
    8. #End Region​


    Gibt es dort nicht irgendwie.. etwas simpleres? Das er in der Loop z.B jede Zeile um das doppelte oder dreifache langsamer verarbeitet? Ich könnte natürlich einen Timer nehmen, aber ich möchte hier gerne mit der Do Loop arbeiten, besonders aus Lernzwecken. Und diese arbeitet nun mal einfach viel zu schnell. Eigentlich ist des ja gut.. aber.. nicht in meiner Situation.

    Ein "Responsive" Sleep wäre schon schön, am besten auch, wenn man dem sagen kann, dass er nur eine 10ms Pause machen soll.
    Wenn ich eine Frage stelle, habe ich sie bereits gegooglet. Ja, es kommt vor, dass ich die Antwort übersehe. Ja, es kommt vor, dass ich sie nicht verstehe. Deshalb bin ich hier. Wenn dies eure Frage war, dann antwortet bitte nicht. Es stiehlt sämtliche Motivation.
    @Sekki Ich denke, Pause(Delta) und Pause(2 * Delta) sollte Deinen Ansprüchen genügen.
    Andererseits kannst Du die zu bewältigende Aufgabe in einer Timer_Tick-Prozedur unterbringen und dann mit .Interval = Delta bzw. .Interval = 2 * Delta arbeiten.
    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!
    Leider weiß ich nicht, wie man beide Sachen anwendet.

    z.B weiß ich nicht, was Async/Await überhaupt ist, auch, wenn ich es oft hier lese. Und das mit "Delta" verstehe ich leider auch nicht..
    Wenn ich eine Frage stelle, habe ich sie bereits gegooglet. Ja, es kommt vor, dass ich die Antwort übersehe. Ja, es kommt vor, dass ich sie nicht verstehe. Deshalb bin ich hier. Wenn dies eure Frage war, dann antwortet bitte nicht. Es stiehlt sämtliche Motivation.

    Sekki schrieb:

    verstehe ich leider auch nicht..
    Pause ist entweder Sleep() oder Delay(), je nach dem.
    Delta ist ein von Dir vorzugebender Wert, der den Abstand zweier zeitlich benachbarter Aktionen beschreibt.
    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!

    Sekki schrieb:

    z.B weiß ich nicht, was Async/Await überhaupt ist, auch, wenn ich es oft hier lese
    mal gegoogelt?
    Oder im Tutorial-Bereich geguckt?

    Bischen problematisch dabei ist, dass Async/Await ungeheur mächtig ist, sodass Tutorials, die das so leidlich abzudecken versuchenu, dir schnell als "zu anspruchsvoll" erscheinen.
    Dabei ist in diesem Fall die Lösung am Ende genau der Simpel, den ich dir gepostet hab - hastes denn wenigstens mal eingepastet in deim Code?

    Und was ich dir schrieb krankt malwieder an der Abwesenheit eines Methodenkopfes, aber das liegt ja nicht an mir.
    Ich sag immer: Code posten bitte immer inklusive des Methodenkopfes, damit wenigstens ein Minimum an Randbedingungen einsehbar ist.

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

    @ErfinderDesRades
    Nun ja, eigentlich melde ich mich nie erneut zu Worte, wenn ich etwas nicht gegooglet habe. Deshalb: Ja, habe ich. Das Problem ist, dass bei mir das ganze nicht funktioniert.

    Die Loop ist in einer Funktion drinnen, vielleicht liegt es daran. Mir ist die Fehlermeldung einfach zu hoch, weshalb ich damit nicht anfangen kann.

    Zwar möchte ich, wie viele hier auch, lernen, aber vorrangig ist es für mich, das Programm fertig zu schreiben. Es ist nämlich nicht für mich, sondern für einen Freund, welches seine Arbeit viel einfacher macht und er nicht mehr so viel mit dem Stress zu tun hat. Mit dem verstehen von spezifisch "Async/Await" würde ich erst in Zukunft anfangen, da ich dann doch schon mehr als genug zu vollenden habe, wenn es um mein Lernstoff geht. Eigentlich dachte ich, dass es vielleicht eine Art Thread.Sleep gibt, welches die GUI nicht aufhängt, deshalb habe ich primär gefragt.
    Wenn ich eine Frage stelle, habe ich sie bereits gegooglet. Ja, es kommt vor, dass ich die Antwort übersehe. Ja, es kommt vor, dass ich sie nicht verstehe. Deshalb bin ich hier. Wenn dies eure Frage war, dann antwortet bitte nicht. Es stiehlt sämtliche Motivation.
    @Sekki Vielleicht postest Du mal den Code dazu.
    Die 1. Meldung sollte klar sein, da stehen Parameter lose in der Zeile rum, mach da ne Klammer drum.
    Beim 2. muss die Prozedur selbst ein Async-Attribut haben:

    VB.NET-Quellcode

    1. Private Async Sub Foo()
    2. ' ...
    3. 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!
    @Sekki: Da ich mir heute schon mal ne bildliche Erklärung aus den Fingern gesogen habe ...
    Zum anderen, was RfG bzgl. Timer geschrieben hat, sollte doch eigentlich machbar sein, oder? Es ist natürlich die Frage, was Du damit vorhast. Wenn z.B. Befehle an ein anderes Fenster geschickt werden sollen, macht sich ein Timer nicht so dolle. Die Info wär praktisch, um Dir sinnvoll weiterhelfen zu können.
    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.
    imo ist ein Timer wahrscheinlich vergleichsweise sehr unpraktisch in diesem Falle.
    Weil das bedeutet vmtl, dass eine einfache Schleife umgebastelt werden muss in eine Art zustandsbehafteten Automaten - codetechnisch totaler Overkill - wo Async doch Gewehr bei Fuss bereitsteht.
    Sekki müsste nur mal lesen, was ich schrieb, und mal die Methode inklusive Kopf posten, dann wär das womöglich in 2 min gemacht.
    Aber er googelt ja lieber, und nimmt sich Lernstoff, den er jetzt braucht, lieber für später vor, wenner das akt. Problem iwie anners zurechtgewurstelt hat.