Sehr schnell in GUI schreiben

  • hallo miteinander,

    ich versuche gerade für mein ein etwas Komplexeres Programm zu schreiben, dazu gehört es das ich ein Stoppuhr mit Einbau, also habe ich mir ein Stoppuhr gebaut.

    Jetzt ist das aber so das diese immer leicht Flackert :(

    gibt es eine sehr schnelle Möglichkeit Groß in die GUI zu schreiben so das mein Flackern weniger wird oder aufhört?

    Das ist mein CODE:

    ich schätze mal das ich nicht die richtige Methode gewählt habe beim ausgeben des Textes in der GUI, leider finde ich keine andre :(

  • 1. Wenn die Anzeige für Sekunden aktualisiert werden soll, aktualisiere nicht alle 30 Millisekunden, sonder alle 500 bis 250 ms (Das Sleep in Zeile 24).

    2. Nicht jedesmal ein neues Label erstellen, sondern einmal 4 Label erstellen und diese aktualisieren. Es ist deutlich mehr aufwand ein neues label zu erstellen, statt den text zu ändern. So hast du innerhalb von sekunden tausende labels die übereinander liegen. Das zeichen der gui wird also mit der zeit immer langsamer.

  • Hey, wäre gut wenn auch die Zentisekunde mit angezeigt wird nicht nur jede Sekunde.


    Ich habe verstanden was du mir sagen möchtest ich soll die Labels schon mal alle zeichnen die ich brauchen könnte dann muss ich die nur noch aufrufen wenn ich sie brauche udn muss die nicht ständig neu erstellen lasse. das habe ich in der Theorie verstanden, wie das Praktisch geht habe ich keine Ahnung :(

    gibt es dazu was im Netz? nach was muss ich da siechen?


    Habe mir das mit dem EventModus gerade mal angeschaut das kenne ich bisher noch nicht. habe das aber glaube ich noch nicht ganz verstanden :(

    https://www.autoitscript.com/autoit3/docs/g…OnEventMode.htm

    wenn ich richtig ist, was ich hoffe.

    dann habe ich ein Hauptprogramm in den ich verschiedene Tasten etc. habe (das Hauptprogramm läuft in einer GUI.

    Alles was dann aber nebenbei gemacht wird sprich Auswertungen Berechnungen etc. das soll nicht im Hauptprogramm ablaufen sondern soll in Funktionen ausgelagert werden?

    ist das richtig was ich da raus gezogen habe?

    gruß Mücke

  • Ich habe jetzt nicht weiter rumprobiert, aber es kann durchaus sein, dass du da an die Grenzen von normalen GUI-Controls kommst. Evtl. müsstest du für so schnelles Zeichnen auf GDIPlus (ö.Ä.) ausweichen.

    Ich hab mal für ein Theaterstück einen Countdown bis zum Beginn programmiert. Das war aber so eine "Es geht in einer halben Stunde los, kriegen wir das noch hin?"-Aktion, daher... Keine Resourcenfreigabe oder so. Bitte so nicht produktiv verwenden!

  • Hallo Muecke

    Ich habe verstanden was du mir sagen möchtest ich soll die Labels schon mal alle zeichnen die ich brauchen könnte dann muss ich die nur noch aufrufen wenn ich sie brauche udn muss die nicht ständig neu erstellen lasse. das habe ich in der Theorie verstanden, wie das Praktisch geht habe ich keine Ahnung

    Genau das machst du doch in Zeile 20 deines Skripts, dass du hier gepostet hast. Du erstellst einmal und dauerhaft das Label, dass du brauchst. Statt dessen könntest du auch für jede Einheit eines erstellen...

    Dein Problem ist doch, dass du nicht verstehst, wie man den Inhalt eines Labels (oder verschiederner Controls bearbeitet). Du änderst den Inhalt mit GUICtrlSetData.
    Oben einmal das Label erstellen, einmal die Farben setzen, einmal den Startwert setzen und danach nur noch mit GUICtrlSetData den Text (die Zeit) ändern. Das ist mit Sicherheit viel performanter, wie Kanashius schon schrieb.


    PS: Versuche es erst einmal wie oben beschrieben. Wenn es dann immer noch Probleme gibt, kannst du auch einmal im blauen Forum schauen. Da hat der GDI+ Meister UEZ eine Variante gepostet, die den Unterschied zwischen einem normalen Label und der GDI+ Vaiante zeigt. Im Beitrag darunter findest du eine andere funktionierende Umsetzung ohne GDI+. https://www.autoitscript.com/forum/topic/17…comment-1279824

    Grüße autoiter

  • Hier hast du was zum Spielen...

    Einmal editiert, zuletzt von Bitnugger (27. November 2018 um 17:27)

  • Bitnugger: Wow dein Code ist genial. Da muss ich mich aber erst ein mal richtig einarbeiten. (da ich kein Programmierer bin dauert das etwas.)

    danke erst mal.

    Oscar : wow, das sieht echt gut aus, ich hoffe das du mir nicht böse bist, ich werde erst mal den Code von Bitnugger mir anschauen und durcharbeiten und schauen was ich alles verstehe und nachlesen was was ist.

    das nimmt einige zeit in Anspruch, bis ich das verstanden habe.

  • Der Code von Oscar ist schon Hochsprache, will ich meinen. Ich lese ihn mir auch gerade durch und ziehe meinen Hut. Hättest nur ein bisschen kommentieren können, lieber Oscar :P

  • Der Code von Oscar ist schon Hochsprache, will ich meinen. Ich lese ihn mir auch gerade durch und ziehe meinen Hut. Hättest nur ein bisschen kommentieren können, lieber Oscar

    Ich will Oscars Code nicht schlecht reden, aber es ist nur eine einfache Stoppuhr. Du kannst den Teil mit der Segmentanzeige und den Kompressionsfunktionen komplett rausschmeißen, sie dienen lediglich der Optik.

    Wenn du den Code nicht verstehst kannst du die Teile rausstreichen und dir nur das angucken was wirklich zur Funktionalität beiträgt, das ist wesentlich einfacher als es sich anmuten mag.

    Der Hauptteil spielt sich in der _ShowTimer-Funktion ab in welcher die aktuelle Zeitmarke in ihre einzelnen Bestandteile aufgeteilt und angezeigt wird.

  • ich bin noch immer am Code von Bitnugger ich habe mir nach jeder ziele ein Kommentar geschrieben was ich meine was da passiert, das ich es nachvollziehen kann.

    Aas ich genial finde ist das ich die Sleep zeit verändern kann im laufenden Programm, ich hatte den Eindruck das bei 40ms das Ergebnis sehr gut dargestellt wird, aus dem Grund habe ich die ganzen HotKeySet und den teil mit der Sleep Zeit erst mal wider raus genommen, da sich das ganze etwas besser überblicken kann.


    das ist der gesamte Code wie ich ihn gerade bei mir habe.

    ich verstehe den teil: Zeile 41 bis 53 glaube ich nicht ganz richtig.

    Wäre gut wenn ihr mir da etwas auf die Sprünge helft ob ich das richtig verstehe.

    Hier werden alle Labels erstellt die für das anzeigen der gesamten zeit benötigt werden.

    Zeile 42: die X Position (Horizontal) wird um eine Nummer weiter gezählt, das es nicht alles Pep aufeinander klebt wird noch 1 Pixel dazu berechnet.

    dann wird ein Neus Laben erstellt, die ID dazu wird in die entsprechende Variable geschrieben.

    usw.


    in Zeile 71. wird dann auf eins der Labels zugegriffen und der Wert (Text) geändert, es muss also nicht erneut erstellt werden oder erneut angezeigt werden denn es wird ja schon angezeigt.

    Ist das richtig was ich da von mir gebe?