Programmcode / Schleifen nacheinander ausführen ?

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Programmcode / Schleifen nacheinander ausführen ?

    Hey,

    ich habe eine Frage zu Schleifen, bzw zur Optimierung.
    Momentan bin ich auf der Suche nach einer "einfacheren" oder eleganteren Lösung für Schleifen.

    Beispiel:
    Timer1 >> Läuft dauerhaft
    TimerWork1 wir jeweils einzeln aufgerufen > Die Dauer bist der Timer fertig ist variiert stark.

    Schleife oder Timer(endlos):

    Quellcode

    1. Clipboard.GetText() : DoStuff() : TimerWork1.Start()
    2. Clipboard.SetText() : DoStuff() : TimerWork1.Start()
    3. CheckValue() : DoStuff() : TimerWork1.Start() : CreateLog()
    4. Clipboard.GetText() : DoStuff() : TimerWork1.Start()


    Ich hoffe das ist so einigermaßen Verständlich.
    Also prinzipiell könnte ich ja IF Abfragen machen und somit jede Zeile einzeln abarbeiten.
    Das würde auch funktionieren, aber ich bin dennoch auf der Suche nach einer alternativen Möglichkeit.
    Wie man erkennen kann, sind die Aufgaben unterschiedlich und haben nach dem TimerWork1 evtl zusätzliche Aufgaben, welche ich abarbeiten möchte bevor die nächste Code Zeile ausgeführt wird ?
    Kann mir jemand erklären wie man das macht ?
    So in der Art wie man es von AutoIt kennt:

    Quellcode

    1. While 1
    2. ClipGet ()
    3. DoStuff()
    4. ClipSet("Test")
    5. CheckValue()
    6. Sleep(100)
    7. WEnd


    Ja, ich hatte es mit AutoIt versucht, allerdings ist es in Sachen Multithreading nicht gerade Top.

    Edit: Sry, die SuFu hat mir nicht weitergeholfen..
    Leider versteh ich überhaupt nicht, was Dein Ziel ist. Wo ist Timer1 in Deinem Code und was macht der beim Tick?

    VB.NET-Quellcode

    1. Clipboard.GetText() : DoStuff() : TimerWork1.Start()
    2. Clipboard.SetText() : DoStuff() : TimerWork1.Start()
    3. CheckValue() : DoStuff() : TimerWork1.Start() : CreateLog()
    4. Clipboard.GetText() : DoStuff() : TimerWork1.Start()

    Zeile 1: TimerWork1 wird am Ende gestartet und macht dann bei Tick irgendwas. Was denn? In der Zwischenzeit geht es weiter mit Zeile 2. Am Ende wieder TimerWork1.Start(). Wurde der inzwischen angehalten? Wenn nicht, wozu ist das reaktivieren gut? Usw.
    Dein AutoIT-Code ist doch 1:1 in VB.Net umsetzbar. Oder fehlt Dir die Info mit z.B. Threading.Thread.Sleep(100)?
    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.

    VaporiZed schrieb:

    Threading.Thread.Sleep(100)

    Damit habe ich es bereits versucht bzw nutze es noch. Allerdings funktioniert es dann nicht so wie ich es mir vorstelle. Die Timer frieren ein.
    Ich versuche mal ein bisschen genauer zu erklären was ich vorhabe.
    (Ich hoffe es verstößt gegen keine Forum-Regel. Habe nichts darüber gefunden..)
    Zurzeit versuche ich ein altes Singleplayer-Spiel, welches ich wieder "neu" entdeckt habe zu botten.
    Dabei liefert das Spiel selbst einige Informationen wie Position (X Y Z), Yaw, Target Distance, welche automatisch im Windowtitle aktualisiert werden.
    Da ich auf dem Gebiet absoluter Neuanfänger bin, weiß ich nicht so recht wie ich das am besten anstelle.
    Es klappt bereits, allerdings würde ich gerne Wissen, ob man jede Codezeile einzeln abarbeiten kann. Also dass immer gewartet wird, bis der vorherige Code fertig ist.
    Deshalb habe ich den Timer1, welcher diese Informationen verarbeitet. + Distanz zu meinen Wegpunkten und Rotation berechnen.
    Außerdem füllt der Timer1 die GUI mit diesen Informationen.
    TimerWork1.Start() >> Läuft dann zu diesen Wegpunkten.
    Beispiel:

    Quellcode

    1. WaypointX = 1200 : WaypointY= 800 : BerechneYaw() : use_Sprint = false : use_Pet = true : TimerWork1.Start()
    2. WaypointX = 2500 : WaypointY = -70 : BerechneYaw() : use_Sprint = true: use_Pet = false : TimerWork1.Start() : use_Skill1()
    3. '>>
    4. TimerWork1 >> If use_Pet then ...

    Regular_vb_user schrieb:

    Die Timer frieren ein.
    Die GUI friert ein denke ich.
    Sleep() bremst den GUI-Thread aus.
    Warum stößt Du den Timer mehrfach an? Ein Mal sollte reichen.
    Jede Codezeile einzel abzuarbeiten ist sehr einfach: Arbeite jede Codezeile einzeln ab. :thumbsup:
    F10 - Debug-Einzelschritt. Allerdings Befehl, nicht Zeile, wenn in dieser Zeile mehrere Befehle stehen. Ansonsten mit einem Haltepunkt in der nächsten Zeile.
    Gugst Du: Debuggen, Fehler finden und beseitigen
    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!

    Regular_vb_user schrieb:

    allerdings würde ich gerne Wissen, ob man jede Codezeile einzeln abarbeiten kann. Also dass immer gewartet wird, bis der vorherige Code fertig ist.
    Das geschieht immer, wenn man nicht mit Nebenläufigkeit arbeitet. Das gibt immer wieder Verwunderung, wenn im Form_Load riesige Datenmengen geladen werden und dann die Frage aufkommt, warum die GUI so träge ist:

    VB.NET-Quellcode

    1. SetupFormular() '3 ms
    2. LoadData() '20 Sekunden
    3. ShowFormular() '2 ms

    Es passiert genau das: Es wird eine Zeile nach der anderen abgearbeitet. Und es wird gewartet, bis eine Zeile fertig ist, bevor es zur nächsten geht.

    Kannst Du bitte nochmal erklären, was passiert und was passieren soll.
    Das Spiel läuft. Du wertest die Titelleiste aus, wo Infos drinstehen. Echtzeitspiel oder rundenbasiert?
    Wann werden die Infos ausgewertet? Kontinuierlich oder in fixen Intervallen?
    Und sobald die Infos da sind, wird dem Spiel ne Info geschickt, was passieren soll, richtig?
    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“ ()

    Es ist ein Echtzeitspiel und die Titelleiste aktualisiert sich ununterbrochen also kontinuierlich.
    (Hatte auch vor einiger Zeit versucht die Titelleiste mit der SetWindowText (user32)umzubenennen, allerdings konnte man die Änderung nicht wahrnehmen.)
    Deshalb dachte ich mir, dass ich einen Timer laufen lasse, welcher nur diese Informationen verarbeitet + Berechnungen durchführt.
    Mein Ziel war es dann die Wegpunkte zu nennen, welche nach der Reihenfolge abgearbeitet werden (mit individuellen Aktionen nach erreichen der Wegpunkte).
    Die Wegpunkte / Koordinaten haben ich bereits vorher notiert und habe die dann mit einem Timer welcher durch einen Button gestartet wird losgeschickt.
    In diesem Tick Event habe ich dann folgende Aufgaben: Prüfen der benötigten Kamerarotation, Berechnen der Entfernung, Reagieren auf sonstige Benutzereingaben > Soll zum Ziel gelaufen werden oder sprinten ? etc. Der Timer wird immer nach erreichen des Wegpunktes gestoppt.
    Um das dann einigermaßen zum laufen zu bringen habe ich ein Integer "BotStep" gesetzt der im Timer abgeprüft und hochgesetzt wird, nach erfolgreichem erreichen von jedem Wegpunkt. Automatisch wird nach dem letzten Wegpunkt wieder der erste als Ziel gesetzt > Endlosschleife.

    Ja, das ganze ist ein bisschen Kompliziert aufgebaut, aber wie gesagt ich habe einfach mal drauflos programmiert 8o
    Wegen der Übersichtlichkeit / Lesbarkeit habe ich dann die Funktionsaufrufe je Koordinaten mit : in eine Zeile gesetzt !
    Ich bin einfach auf der Suche nach einer eleganteren Variante und wenn auch möglich Einzelsatz.

    Außerdem hätte ich noch die Frage was hier für Erfahrungen mit dem Timer Tick Intervall gemacht wurden.
    Ich habe den Timer der die Window-Informationen ließt auf dem Standardwert, was mir auch reicht.
    Sind die Intervalle unter 100 überhaupt sinnvoll ?

    Regular_vb_user schrieb:

    Sind die Intervalle unter 100 überhaupt sinnvoll ?
    Was ist es denn für ein Timer?
    WinForm oder Threading?
    Und wenn Du in der Tick-Prozedur die GUI anfasst, musst Du eh in den MainThread invoken.
    Wie lange dauert die Abarbeitung der Timer-Prozedur?
    Wie viel Zeit vergeht, bis neue Daten relevant sind?
    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!
    -WinForm Timer auf Standard 100 Interval
    -Dauer der Abarbeitung der Timer Prozedur ? >> Unterschiedlich, bis das Ziel (Waypoint) erreicht ist.
    -Wenn ich deine Frage richtig verstehe dann lautet meine Antwort: Die Zeit die benötigt wird, bis neue Daten / Wegpunkte / Ziele relevant sind, variiert.

    Also schon mal danke an alle Antworten bisher.
    Wie gesagt das Programm läuft und ich brauch dafür nicht den DebugMode um Fehler zu finden.
    Generell halte ich außerdem das Form_Load Event sauber, bis auf ein Timer.Start().
    Ich bin nur am überlegen es einfach(er) aufzubauen.
    Und dies möglichst mit 1x Timer der Informationen verarbeitet und dann eine Schleife die meine Befehle ausführt.
    Ich werde mal weiter überlegen und testen.

    Grüße

    Vollzitat entfernt. ~Thunderbolt

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

    @Regular_vb_user In jedem Falle solltest Du dafür sorgen, dass ein zweiter Timer_Tick nicht in die Prozedur kommt, so lange der erste sie nicht verlassen hat.
    Eine Möglichkeit:
    Zu Beginn Timer.Stop()
    am Ende: Timer.Start()
    =====

    Regular_vb_user schrieb:

    ich brauch dafür nicht den DebugMode um Fehler zu finden.
    Ich verneige mich vor Dir. X(
    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!