1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. Mars

Beiträge von Mars

  • [GDI+] Casteljau Beispiel & Bezier Beispiel

    • Mars
    • 14. August 2020 um 15:45

    Moin,

    Es ist eigentlich nichts großes, aber ich habe genau so ein Beispiel letztens gesucht und falls irgendwer sonst mal auf die Idee kommt den Casteljau3 (mit q = 3) Algorithmus (er ist wirklich trivial) zu basteln hat er hier eine kleine Vorlage (außerdem endet Casteljau3 auf "au3". Allein deshalb muss das hier ins Forum).

    Mit den Variablen $bDrawXYZ (zeile 17 & 18) kann man auswählen in welchen Iterationsstufen man das Zwischenergebnis anzeigen lassen will.

    Edit: Habe noch ein Beispiel für BezierN gebastelt.

    unnamed.pngunnamed.png

    AutoIt
    #include <GDIPlus.au3>
    
    Opt('GUIOnEventMode', 1)
    
    Global Const $sTitle = 'Casteljau3'
    Global Const $iW = 512
    Global Const $iH = 512
    
    Global Const $COL_HELLBLAU = 0xFF8EDFFF
    Global Const $COL_ORANGE = 0xFFFDB961
    Global Const $COL_GRUEN = 0xFF45ED67
    Global Const $COL_VIOLETT = 0xFFD980E1
    Global Const $COL_RED = 0xFFE28576
    Global Const $COL_TUERKIS = 0xFF76E2B4
    
    Global Const $aCol = [$COL_HELLBLAU, $COL_ORANGE, $COL_GRUEN, $COL_VIOLETT, $COL_RED, $COL_TUERKIS]
    Global Const $bDrawLines  = [True, False, False, False, False, True]
    Global Const $bDrawPoints = [True, False, False, False, False, False]
    Global Const $MaxIter = UBound($bDrawLines) - 1
    
    Global $aInput = [[0.15, 0.85], [0.5, 0.1], [0.8, 0.3], [0.7, 0.8]]
    
    Global $bExit = False
    
    _GDIPlus_Startup()
    Global $hGUI = GUICreate($sTitle, $iW, $iH)
    Global $hGFX = _GDIPlus_GraphicsCreateFromHWND($hGUI)
    Global $hBMP = _GDIPlus_BitmapCreateFromGraphics($iW, $iH, $hGFX)
    Global $hBUF = _GDIPlus_ImageGetGraphicsContext($hBMP)
    Global $hPEN = _GDIPlus_PenCreate()
    
    _GDIPlus_PenSetStartCap($hPEN, 2)
    _GDIPlus_PenSetEndCap($hPEN, 2)
    
    _GDIPlus_GraphicsSetSmoothingMode($hBUF, 2)
    
    GUISetOnEvent(-3, 'EVENT', $hGUI)
    OnAutoItExitRegister('Xit')
    GUISetState(@SW_SHOW, $hGUI)
    
    Local $Timer = TimerInit(), $t = 0
    
    While Not $bExit And Sleep(10)
        $t = TimerDiff($Timer)/1000
        _GDIPlus_GraphicsClear($hBUF)
        Casteljau3($aInput)
        $aInput[0][0] = 0.15 + Cos($t)/15
        $aInput[0][1] = 0.85 + Sin($t)/15
        $aInput[1][0] = 0.5 + Cos($t/2)/15
        $aInput[1][1] = 0.1 + Sin($t/2)/15
        $aInput[2][0] = 0.8 + Cos($t/3)/15
        $aInput[2][1] = 0.3 + Sin($t/3)/15
        $aInput[3][0] = 0.7 + Cos($t/5)/15
        $aInput[3][1] = 0.8 + Sin($t/5)/15
        _GDIPlus_GraphicsDrawImageRect($hGFX, $hBMP, 0, 0, $iW, $iH)
    WEnd
    
    Func Casteljau3($a, $iter = 0)
    
        Local $iCol = $aCol[$iter]
        _GDIPlus_PenSetColor($hPEN, $iCol)
        _GDIPlus_PenSetWidth($hPEN, 0.005 * $iW * 0.9^$iter)
        _GDIPlus_PenSetDashStyle($hPEN, 0)
        For $i = 0 To UBound($a, 1) - 1 Step 1
            If $bDrawPoints[$iter] Then Circle($a[$i][0], $a[$i][1], 0.025 * 0.9^$iter)
        Next
        _GDIPlus_PenSetWidth($hPEN, ($iter = $MaxIter ? 0.0035 : 0.0025) * $iW)
        _GDIPlus_PenSetDashStyle($hPEN, $iter = $MaxIter ? 0 : 1)
        For $i = 0 To UBound($a, 1) - 2 Step 1
            If $bDrawLines[$iter] Then Line($a[$i][0], $a[$i][1], $a[$i+1][0], $a[$i+1][1])
        Next
    
        If $iter < $MaxIter Then
            ; Neue Eckpunkte berechnen: Es gibt 7 Punkte, der Mittlere ist doppelt.
    
            Local $p0 = [$a[0][0], $a[0][1]]
            Local $p1 = [($a[0][0] + $a[1][0])/2, ($a[0][1] + $a[1][1])/2]
            Local $p5 = [($a[2][0] + $a[3][0])/2, ($a[2][1] + $a[3][1])/2]
            Local $p6 = [$a[3][0], $a[3][1]]
    
            Local $m = [($a[1][0] + $a[2][0])/2, ($a[1][1] + $a[2][1])/2] ; Mittelpunkt
    
            Local $p2 = [($m[0] + $p1[0])/2, ($m[1] + $p1[1])/2]
            Local $p4 = [($m[0] + $p5[0])/2, ($m[1] + $p5[1])/2]
    
            Local $p3 = [($p2[0] + $p4[0])/2, ($p2[1] + $p4[1])/2]
    
            Local $aL = [[$p0[0], $p0[1]], [$p1[0], $p1[1]], [$p2[0], $p2[1]], [$p3[0], $p3[1]]]
            Local $aR = [[$p3[0], $p3[1]], [$p4[0], $p4[1]], [$p5[0], $p5[1]], [$p6[0], $p6[1]]]
    
            Casteljau3($aL, $iter + 1)
            Casteljau3($aR, $iter + 1)
        EndIf
    
    EndFunc
    
    Func Line($x1, $y1, $x2, $y2)
        _GDIPlus_GraphicsDrawLine($hBUF, $x1 * $iW, $y1 * $iH, $x2 * $iW, $y2 * $iH, $hPEN)
    EndFunc
    
    Func Circle($x, $y, $d)
        _GDIPlus_GraphicsDrawEllipse($hBUF, $x * $iW - $d/2 * $iW, $y * $iH - $d/2 * $iH, $d * $iW, $d * $iH, $hPEN)
    EndFunc
    
    Func EVENT()
        Switch @GUI_CtrlId
            Case -3
                $bExit = True
        EndSwitch
    EndFunc
    
    Func Xit()
        _GDIPlus_PenDispose($hPEN)
        _GDIPlus_GraphicsDispose($hBUF)
        _GDIPlus_BitmapDispose($hBMP)
        _GDIPlus_GraphicsDispose($hGFX)
        _GDIPlus_Shutdown()
    EndFunc
    Alles anzeigen
    AutoIt
    #include <GDIPlus.au3>
    #include <Misc.au3>
    
    Opt('GUIOnEventMode', 1)
    Opt('MouseCoordMode', 2)
    
    Global Const $sTitle = 'BezierN'
    Global Const $iW = 512
    Global Const $iH = 512
    Global Const $nBezierPoints = 35
    
    Global $aKontrollPunkte[0]
    AddPoint($aKontrollPunkte, 0.1, 0.2)
    AddPoint($aKontrollPunkte, 0.1, 0.3)
    AddPoint($aKontrollPunkte, 0.3, 0.7)
    AddPoint($aKontrollPunkte, 0.6, 0.8)
    AddPoint($aKontrollPunkte, 0.9, 0.2)
    AddPoint($aKontrollPunkte, 0.9, 0.9)
    AddPoint($aKontrollPunkte, 0.5, 0.5)
    
    Func AddPoint(ByRef $a, $x, $y)
        Local $z = [$x, $y], $u = UBound($a)
        ReDim $a[$u + 1] ; Jaaah macht man ja nur 1x am Anfang. Bitte NICHT oft nutzen, langsam.
        $a[$u] = $z
    EndFunc
    
    Global $aBezierN = BezierN($aKontrollPunkte, $nBezierPoints)
    
    ; Input : Array[i] = Array[2] = [x, y] für beliebige Punktmengen
    ; Output: Array[i] = Array[2] = [x, y] mit $n Einträgen
    Func BezierN(ByRef $aPoints, $n = 25)
        Local $u = UBound($aPoints), $aBuf[$u][2], $aRet[$n], $r = 0, $t = 0, $a[2], $b[2], $c[2], $m = 0
        For $tt = 0 To $n - 1 Step 1
            $t = $tt / ($n - 1)
            For $i = 0 To $u - 1 Step 1
                $aBuf[$i][0] = $aPoints[$i]
            Next
            For $sub = 2 To $u Step 1
                $m = IsInt($sub/2)
                For $i = 0 To $u - $sub Step 1
                    $a = $aBuf[$i][1-$m]
                    $b = $aBuf[$i+1][1-$m]
                    $c[0] = $a[0] + $t * ($b[0] - $a[0])
                    $c[1] = $a[1] + $t * ($b[1] - $a[1])
                    $aBuf[$i][$m] = $c
                    If $sub = $u Then
                        $aRet[$r] = $aBuf[$i][$m]
                        $r += 1
                    EndIf
                Next
            Next
        Next
        Return $aRet
    EndFunc
    
    Global $bExit = False
    
    _GDIPlus_Startup()
    Global $hGUI = GUICreate($sTitle, $iW, $iH)
    Global $hGFX = _GDIPlus_GraphicsCreateFromHWND($hGUI)
    Global $hBMP = _GDIPlus_BitmapCreateFromGraphics($iW, $iH, $hGFX)
    Global $hBUF = _GDIPlus_ImageGetGraphicsContext($hBMP)
    Global $hPEN = _GDIPlus_PenCreate()
    
    _GDIPlus_PenSetStartCap($hPEN, 2)
    _GDIPlus_PenSetEndCap($hPEN, 2)
    _GDIPlus_GraphicsSetSmoothingMode($hBUF, 2)
    
    GUISetOnEvent(-3, 'EVENT', $hGUI)
    OnAutoItExitRegister('Xit')
    GUISetState(@SW_SHOW, $hGUI)
    
    While Not $bExit And Sleep(10)
        _GDIPlus_GraphicsClear($hBUF)
        $aBezierN = BezierN($aKontrollPunkte, $nBezierPoints)
        Print($aBezierN, 0.015, 0xFFFF6050)
        Print($aKontrollPunkte, 0.025, 0xFF808080)
        Mouse($aKontrollPunkte)
        _GDIPlus_GraphicsDrawImageRect($hGFX, $hBMP, 0, 0, $iW, $iH)
    WEnd
    
    Func Mouse(ByRef $aPoints)
        Local $mPos = MouseGetPos(), $a[2]
        Local Static $iDrag = -1
        _GDIPlus_PenSetColor($hPEN, 0xFF80FF00)
        _GDIPlus_PenSetWidth($hPEN, (0.035 / 5.0) * $iW)
        _GDIPlus_PenSetDashStyle($hPEN, 0)
        For $i = 0 To UBound($aPoints) - 1 Step 1
            If Sqrt(($mPos[0]/$iW - ($aPoints[$i])[0])^2 + ($mPos[1]/$iH - ($aPoints[$i])[1])^2) < 0.0325 Then
                If _IsPressed('01') Then
                    $iDrag = $i
                Else
                    $iDrag = -1
                EndIf
                Circle($aPoints[$i], 0.035)
            EndIf
        Next
        If $iDrag <> -1 Then
            $a[0] = $mPos[0] / $iW
            $a[1] = $mPos[1] / $iH
            $aPoints[$iDrag] = $a
        EndIf
    EndFunc
    
    Func Print(ByRef $aPoints, $d = 0.025, $iCol = 0xFFFFFFFF)
        _GDIPlus_PenSetColor($hPEN, $iCol)
        _GDIPlus_PenSetWidth($hPEN, ($d / 5.0) * $iW)
        _GDIPlus_PenSetDashStyle($hPEN, 0)
        For $i = 0 To UBound($aPoints) - 1 Step 1
            Circle($aPoints[$i], $d)
        Next
        _GDIPlus_PenSetWidth($hPEN, ($d / 8.0) * $iW)
        _GDIPlus_PenSetDashStyle($hPEN, 1)
        For $i = 0 To UBound($aPoints) - 2 Step 1
            Line($aPoints[$i], $aPoints[$i+1])
        Next
    EndFunc
    
    Func Line($p1, $p2)
        _GDIPlus_GraphicsDrawLine($hBUF, $p1[0] * $iW, $p1[1] * $iH, $p2[0] * $iW, $p2[1] * $iH, $hPEN)
    EndFunc
    
    Func Circle($p, $d)
        _GDIPlus_GraphicsDrawEllipse($hBUF, $p[0] * $iW - $d/2 * $iW, $p[1] * $iH - $d/2 * $iH, $d * $iW, $d * $iH, $hPEN)
    EndFunc
    
    Func EVENT()
        Switch @GUI_CtrlId
            Case -3
                $bExit = True
        EndSwitch
    EndFunc
    
    Func Xit()
        _GDIPlus_PenDispose($hPEN)
        _GDIPlus_GraphicsDispose($hBUF)
        _GDIPlus_BitmapDispose($hBMP)
        _GDIPlus_GraphicsDispose($hGFX)
        _GDIPlus_Shutdown()
    EndFunc
    Alles anzeigen

    lg

    M

  • MoveToMouse

    • Mars
    • 23. Juli 2020 um 21:11

    Ich habe nicht reingeschaut und nichts ausprobiert, aber meine Intuition sagt mir, dass GDI+ hier die falsche Hausnummer ist. Wenn ich das richtig sehe sollen relativ großflächige Bitmaps (mit Transparenz) übereinandergezeichnet werden. GDI+ kommt schon bei EINER Bitmap in Fullscreen Auflösung ins schwitzen.

    Ich würde das ganze in D2D oder via WinAPI (AlphaBlend aus der GDI32.dll) versuchen.

    Wenn man nur ein paar % CPU-Last will ist D2D auf jedenfall die richtige Wahl dafür.

    lg

    M

  • MsgBox mit Zeitbegrenzung

    • Mars
    • 7. Juli 2020 um 16:31

    ich würde das über ein Fenster mit transparentem Hintergrund und einem WinAPI BitBlt regeln. Damit kann man in den Bereich von 1 Frame kommen (also 1/60tel sekunde), während Tooltips und MsgBox einen großen Overhead haben (immerhin wird da jedes Mal ein Fenster erzeugt) ist die Methode mit einem existierenden transparenten Fenster das nur kurzfristig eine Bitmap anzeigt ziemlich flott.

  • AutoIT - Prognosen zur Weiterentwicklung

    • Mars
    • 6. Juli 2020 um 19:30

    Ich sehe das auch nicht als Angriff ;)

    Für nahezu alles was GUIs oder (fern) Steuerung von Programmen beinhaltet ist AutoIt nach wie vor die erste Wahl und egal wie schnell oder gut man in C++ ist, keine Chance da auch nur ansatzweise in vergleichbarer Zeit zu einem vergleichbaren Ergebnis zu kommen, selbst wenn man jede lib auswendig kennt (was utopisch ist, da es quasi unendlich viele gibt^^).

    Mein Problem ist, dass ich AutoIt hinterherweine, weil das die erste (und einzige) Sprache ist die ich wirklich verinnerlicht habe (egal wie man es dreht, ich kann einige Sprachen, aber bei keiner kenne ich gefühlte 99% aller Funktionalität), aber jedes Mal wenn mir ein lustiges Feature unterkommt frage ich mich: Das ist doch ansich echt cool und macht vieles einfacher. Das will ich in meiner Lieblingssprache auch.

    Ich will ja nicht, dass die Sprache ihren Kern verliert. Ich will nur irgendwie "das beste aus beiden Welten". Die Einfachheit und Fehlertoleranz, mit der man extrem schnell zu guten Ergebnissen kommt kombiniert mit der Möglichkeit auch kompliziertere Sachen leserlich(er) zu gestalten.

    Es ist auch nicht schlimm wenn man das anders sieht, dafür sind wir doch alle individuelle Menschen die ihren eigenen Kopf mit eigenen Vorlieben haben :S

  • AutoIT - Prognosen zur Weiterentwicklung

    • Mars
    • 5. Juli 2020 um 12:23

    Ich programmiere (hauptsächlich) in AutoIt und C++ (aktuell, AutoIt für quick n dirty was ausprobieren, C++ für die Arbeit, oder wenn etwas "richtig" gemacht werden soll).

    Was mir in AutoIt fehlt sind eindeutig Objekte. Ja ich war früher ein OOP Gegner (weil ich OOP hauptsächlich von Java kannte, und mir jede scheiß Vorlesung Java quer in den Hals gestopft hat und ich damit einen richtig intensiven Hass gegen Java entwickelt habe). Es gibt aber auch andere Ansätze (Die sehr komfortabel sind), z.B Objekte auf das zu reduzieren was sie sind: Eine Struct mit angehängten Funktionen.

    Ich will in AutoIt die Möglichkeit eine Struct (oder Map) zu haben der ich ein paar Funktionen zuordnen kann (ja ich weiß, dass man einfach den Funktionspointer in die Map packen kann, und dann Aufrufe nach dem Prinzip ($Map.funktion)($Map, $a, $b, $c) hat (ohne die Klammer um $Map.funktion geht es aus unerfindlichen Gründen nicht). Der Folgepunkt ist sowieso hundertmal wichtiger.

    Ich will in AutoIt die Möglichkeit Operatoren für Structs (oder Maps) zu definieren. Wenn ich meine Vector2(float, float) Struct habe will ich z.B. $a += $b schreiben können.

    Das Ding hinter "Objekten" oder Operatoren ist nicht, dass ich unbedingt den Stil einer anderen Sprache haben will, sondern, dass der Komfort so gigantisch ist, dass ich mir ohne diese Möglichkeiten immer ein bisschen wie im Mittelalter vorkomme. Natürlich kann ich alles von Hand ausschreiben, für Operatoren Funktionen basteln AddRefVec2fValVec2f($a, $b) statt $a += $b, usw usw. Es ist aber so viel schöner, wenn man sich selbst Datentypen definieren kann und damit problemlos rechnen kann ohne 500 verschiedene (gnadenlos überladene) Funktionen auswendig wissen zu müssen.

    Als letzten Punkt gäbe es da natürlich noch das Überladen der Operatoren (und wenn man will von Funktionen). Aktuell kann man das indirekt schon machen (z.B. indem man eine Funktion mit 5 default parametern hat und intern je nach Datentyp der Eingabe unterscheidet welche "Version" der Funktion man ausführen will), aber unter der Voraussetzung, dass es Objekte/Map/Struct + Operatoren gibt sollte es möglich sein z.B. das "+" zu überladen, dass ich damit meine Vec2 + Vec2 oder auch Vec3 + Vec3 rechnen kann und zwar mit dem selben operator.

    Klingt jetzt doof, aber ich bin in C++ oft wesentlich schneller und wesentlich Fehlerärmer unterwegs, einfach aus dem Grund, weil es Operatoren gibt. Statt 3 Seiten voller Indexgekloppe (wenn man $vec2 = Array[2] mit [0]=x und [1] = y hat z.B.) gibt es eine Hand voll gemütlicher nachvollziehbarer wartbarer Zeilen.

    lg

    M

  • RegExp: Verschachtelte Block-Kommentare entfernen - Char nicht-in-String ersetzen

    • Mars
    • 1. Juli 2020 um 17:34

    Wenn du mit den vielen RegExen fertig bist, kannst du dann eine Art "Sammlung von RegExen zum parsen von AutoIt" veröffentlichen?

    Das kann man sicher für irgendetwas gebrauchen 8)

  • AutoIt: Bitte um Hilfe

    • Mars
    • 28. Juni 2020 um 11:35

    Ist zwar offtopic, aber: Yeeeeah. Jemand anderes der Marcus mit C heißt <3 (jetzt sind wir schon 2 und können die Welt erobern)

    Zum Thema: Es kommt schwer darauf an, ob in den AGBs der Webseite automatisierungen verboten werden (Das ist bei eingien Spielen der Fall). Mach dich bitte zuerst in diese Richtung schlau und poste am besten den Link, dann können wir hier auch einen Blick darauf werfen. Wenn Automatisierungen erlaubt sind läufst du keine Gefahr Ärger zu bekommen und hier im Forum supporten wir auch nur "erlaubte" Automatisierungen (siehe Forenregeln).

    lg

    M

  • Allgemeiner Meinungsaustausch zum Thema "Corona"

    • Mars
    • 26. Juni 2020 um 15:48

    ich hab schon verstanden dass das Sarkasmus war :D

    Man kann nicht unendlich lange tauchen (bzw. unendlich lange die Wirtschaft "anhalten", wobei sie ja ansich weiterläuft, nur eben "anders") und muss ab und zu auftauchen. Das Problem ist, dass man entweder 3 Min die Luft anhält, oder 2,5Min + 2Min + 1,5Min + 1Min + 0,5Min wenn man zwischendrin Luft holt. Und ich weiß nicht was da besser ist. Bin jedenfalls kein Fan davon dass einfache Sachen wie "Alle Einkaufswagen desinfizieren" oder ähnliches (zumindest bei mir vor Ort, wie es in anderen Gebieten aussieht weiß ich nicht) abgeschafft wurden, wobei das doch echt vergleichsweise wenig Aufwand ist einen Mitarbeiter mit einem Lappen auszurüsten. Selbst wenn es in 99% der Fälle nichts bringt weil keiner der Kunden Corona hat, irgend jemandem wurde damit das Leben gerettet und dieser Jemand ist echt froh dass der Einkaufswagen ihn nicht angesteckt hat.

  • Allgemeiner Meinungsaustausch zum Thema "Corona"

    • Mars
    • 26. Juni 2020 um 15:26

    Also erst werden die ganzen Sicherheitsmaßnahmen abgeschafft oder gelockert und jetzt geht die Ansteckungszahl wieder steil. Wer hätte das kommen sehen... Hab ich was verpasst oder ist meine Logik einfach nur falsch?

  • Ich wurde gehackt ;-)

    • Mars
    • 18. Juni 2020 um 18:52

    unnamed.png

    Der nette Herr Manuel Franco hat mir 850.000€ gespendet. Echt ein netter Typ.
    Hätte er eine seriöse Adresse wie vertrauenROFLxyzTrust@deineMutter.com hätte ich geantwortet, aber seine Adresse kommt mir spanisch vor.

  • Ich wurde gehackt ;-)

    • Mars
    • 2. Juni 2020 um 10:24

    unnamed.png

    Also genaugenommen habe ich die Nachricht jetzt weitergegeben. Wo bleiben meine Pornovideos? Aviana, hörst du mich?

    Für 1000€ (wenn du sie mir gibst, nicht umgekehrt) kraule ich dir auch den Nacken (aber nur 1x. alles hat seinen Preis).

    Edit: ja eine Kamera habe ich auch nicht am PC und das Mikrofon ist physikalisch nicht verbunden wenn ich es nicht benutze. Wenn jemand das hacken kann und sich der Stecker von selbst verbindet gibts einen Nobelpreis für Telekinese (und 1Mio Dollar von der https://de.wikipedia.org/wiki/James_Ran…onal_Foundation)

  • Kann mein eigenes Programm nicht löschen - von Avira keine Unterstützung...

    • Mars
    • 5. Mai 2020 um 13:58

    Erkennungssoftware die AutoIT schreibt kann ich nicht ernst nehmen. Die machen sich nichtmal die Mühe den Namen richtig zu schreiben.

  • Kann mein eigenes Programm nicht löschen - von Avira keine Unterstützung...

    • Mars
    • 4. Mai 2020 um 10:57

    Es ist lächerlich, dass man seine Software als Programmierer in eine Whitelist eintragen lassen muss damit sie nicht gesperrt wird. Was genau "erkennt" denn ein Antivirenprogramm heutzutage? Es erkennt alles als Virus was nicht auf der Whitelist ist (also Hashsumme + Lookup = gesperrt weil unbekannt)?

    Ich schiebe inzwischen einen richtigen Hass auf Antivirenhersteller. Man schreibt für irgendwen ein Tool weil irgendwer unbedingt einen Viewer für auf der Festplatte liegende Binärdaten einer float16 Matrix braucht. Kein Problem, dauert nicht lange. Tool gebaut -> Tool verschickt -> Beim Empfänger wird das Internet deinstalliert, der Atombunker einsatzbereit gemacht, Klopapier gekauft und die Notstromversorgung mit roter Alarmleuchte + Sirene springt an.

  • MsgBox verlangsamt den Skriptablauf unter Win 10

    • Mars
    • 29. April 2020 um 13:58
    Zitat von Musashi

    Nebenbei : Ich habe gehört, dass Du immer noch gerne mit der Trommel um den Baum rennst :P .

    Pschhhhht. :D

    Mir ist jetzt erst aufgefallen, dass dieser Thread in "Forum -> Sonstiges -> Off-Topic" liegt. Und ich hatte schon Angst zu sehr vom Thema abzuweichen :part:

  • MsgBox verlangsamt den Skriptablauf unter Win 10

    • Mars
    • 29. April 2020 um 13:32

    Wieso muss ICH Fehler ausbaden die zu einer Zeit passiert sind als ich 10 Jahre alt war und mit einer Trommel um den Weihnachtsbaum gerannt bin?

    Ich bin dafür, dass Leute die im DE Forum Poweruser sind (die werden ja durch die Community ernannt, sind also üblicherweise Leute die "in Ordnung" sind und teilweise auch als Informatiker/Programmierer arbeiten, also ein bisschen know how haben, ein paar Jahre dabei sind, usw.) am Code mitarbeiten dürfen. Wie es im EN Forum mit MVP's aussieht weiß ich nicht, da ich da zwar einen Acc habe aber nie aktiv bin.

    (Das ist jetzt Offtopic, aber im Prinzip musste ich das hier ergänzen weil es aktuell nur hier hinpasst)

    M

  • MsgBox verlangsamt den Skriptablauf unter Win 10

    • Mars
    • 29. April 2020 um 00:34

    Am Besten wäre Open Source :rock:

    Einfach den Code auf Github und ab gehts.

    Ein Lösungsansatz wäre sowas wie:
    EventsOff()
    Code der schnell laufen soll
    EventsOn()

    Es ist doch auch wahnsinn, dass man in JEDER ProgrammZEILE checkt ob der User auf X geklickt hat. Das sieht für mich nach 99% Overhead im Interpreter aus.

  • winclosearea() - suche eine Funktion, die dieser entspricht oder einen Workaround

    • Mars
    • 17. April 2020 um 16:45

    Schätze auch, dass es ein XY Problem ist. Überlicherweise hat jedes Firefox Fenster eine eigene PID (die in AutoIt z.B. von Run() zurückgegeben wird), darüber lassen sich selbst Fenster mit gleichem Fensternamen vom gleichen Programm dennoch unterscheiden.

    Mir ist aber unklar was es bringt 4 Stoppuhren dauerhaft laufen zu haben und nach je 5 Minuten die Seiten neu zu laden :D

    Edit: Jetzt sehe ich erst, dass Musashi der Grammatik und Fragestellungskorrektschreibungskönig ist :rock:

    lg

    M

  • MsgBox verlangsamt den Skriptablauf unter Win 10

    • Mars
    • 7. April 2020 um 11:11

    Mir hat es auch keine Ruhe gelassen, aber ich habe keine Lust auf externe Tools gehabt :D

    Code
    Local $1 = Timing(1500, False)
    MsgBox(0,'','')
    Local $2 = Timing(1500, False)
    
    
    Local $aMaxLen[3] = [StringLen($1[0][0]), StringLen(StringFormat('%.2f', $1[0][1])), StringLen(StringFormat('%.2f', $2[0][1]))]
    For $i = 0 To UBound($1) - 1 Step 1
    If StringLen($1[$i][0]) > $aMaxLen[0] Then $aMaxLen[0] = StringLen($1[$i][0])
    If StringLen($1[$i][1]) > $aMaxLen[1] Then $aMaxLen[1] = StringLen($1[$i][1])
    If StringLen($2[$i][1]) > $aMaxLen[2] Then $aMaxLen[2] = StringLen($2[$i][1])
    Next
    ConsoleWrite(StringLeft('Testfunktion' & '                ', $aMaxLen[0]) & '   ' & 'Vorher [ns] Nachher [ns] Diff [ns]' & @CRLF)
    For $i = 0 To UBound($1) - 1 Step 1
    ConsoleWrite(StringLeft($1[$i][0] & '                ', $aMaxLen[0] + 1) & ' |   ' & StringRight('     ' & $1[$i][1], $aMaxLen[1]) & '   |   ' & StringRight('     ' & $2[$i][1], $aMaxLen[2]) & '   |  ' & StringRight('     ' & StringFormat('%.1f', $2[$i][1]-$1[$i][1]), $aMaxLen[1])& '  |' & @CRLF)
    Next
    
    
    Func Timing($n = 1500, $bConsole = True)
    ; [0] Name
    ; [1] FuncPtr
    ; [2] MedianCounter
    ; [3] a
    ; [4] b
    ; [5] c
    ; [6] Summe (Nanosekunden)
    ; [7] Counter
    Local $aTimings = [ _
    ['should be zero'     , _09, 0, 0, 0, 0, 0, 0], _
    ['Local $a'           , _01, 0, 0, 0, 0, 0, 0], _
    ['Local $aaaaaa'      , _02, 0, 0, 0, 0, 0, 0], _
    ['Local $aaaaaaaaaa'  , _03, 0, 0, 0, 0, 0, 0], _
    ['Local $a = 0'       , _24, 0, 0, 0, 0, 0, 0], _
    ['$a = 0'             , _04, 0, 0, 0, 0, 0, 0], _
    ['$a = True'          , _16, 0, 0, 0, 0, 0, 0], _
    ['$a = Null'          , _22, 0, 0, 0, 0, 0, 0], _
    ['$a = Default'       , _23, 0, 0, 0, 0, 0, 0], _
    ['$a = Abs'           , _25, 0, 0, 0, 0, 0, 0], _
    ['$a = TimerInit'     , _26, 0, 0, 0, 0, 0, 0], _
    ['$a += 0'            , _05, 0, 0, 0, 0, 0, 0], _
    ['$a += b'            , _06, 0, 0, 0, 0, 0, 0], _
    ['$a *= b'            , _07, 0, 0, 0, 0, 0, 0], _
    ['$a /= b'            , _08, 0, 0, 0, 0, 0, 0], _
    ['TimerInit()'        , _10, 0, 0, 0, 0, 0, 0], _
    ['TimerDiff(0)'       , _21, 0, 0, 0, 0, 0, 0], _
    ['Sqrt(5)'            , _14, 0, 0, 0, 0, 0, 0], _
    ['$a = TimerDiff($t)' , _20, 0, 0, 0, 0, 0, 0], _
    ['$a = $a ^ 1.01'     , _11, 0, 0, 0, 0, 0, 0], _
    ['$a = $a ^ $b'       , _12, 0, 0, 0, 0, 0, 0], _
    ['$a = Sin(3.1415)'   , _13, 0, 0, 0, 0, 0, 0], _
    ['$a = Sqrt($a)'      , _15, 0, 0, 0, 0, 0, 0], _
    ['$a = Not True'      , _17, 0, 0, 0, 0, 0, 0], _
    ['$a = True And True' , _18, 0, 0, 0, 0, 0, 0], _
    ['$a = True Or True'  , _19, 0, 0, 0, 0, 0, 0]]
    
    
    Local $r, $u = UBound($aTimings) - 1
    For $i = 1 To $n Step 1
    $r = Random(0, $u, 1)
    $aTimings[$r][$aTimings[$r][2]+3] = $aTimings[$r][1]() * 1000
    $aTimings[$r][2] += 1
    If $aTimings[$r][2] = 3 Then
    $aTimings[$r][2] = 0
    $aTimings[$r][6] += Median($aTimings[$r][3], $aTimings[$r][4], $aTimings[$r][5])
    $aTimings[$r][7] += 1
    EndIf
    Next
    
    
    Local $aRet[$u+1][2], $aMaxLen[2] = [StringLen($aTimings[0][0]), StringLen(StringFormat('%.1f', $aTimings[0][6] / $aTimings[0][7]))]
    For $i = 0 To $u Step 1
    $aRet[$i][0] = $aTimings[$i][0]
    $aRet[$i][1] = StringFormat('%.1f', $aTimings[$i][6] / $aTimings[$i][7])
    For $ii = 0 To 1 Step 1
    If StringLen($aRet[$i][$ii]) > $aMaxLen[$ii] Then $aMaxLen[$ii] = StringLen($aRet[$i][$ii])
    Next
    Next
    
    
    If $bConsole Then
    ConsoleWrite(StringLeft('Testfunktion' & '                ', $aMaxLen[0]) & '   ' & 'Time [ns]' & @CRLF)
    For $i = 0 To $u Step 1
    ConsoleWrite(StringLeft($aRet[$i][0] & '                ', $aMaxLen[0] + 1) & '   ' & StringRight('     ' & $aRet[$i][1], $aMaxLen[1]) & @CRLF)
    Next
    EndIf
    
    
    Return $aRet
    
    
    EndFunc
    
    
    
    
    Func Median($a, $b, $c)
    Local $t
    If $a > $b Then
    $t = $a
    $a = $b
    $b = $t
    EndIf
    If $b > $c Then
    $t = $b
    $b = $c
    $c = $t
    EndIf
    If $a > $b Then
    $t = $a
    $a = $b
    $b = $t
    EndIf
    Return $b
    EndFunc
    
    
    Func _00()
    Local $t = TimerInit()
    For $i = 1 To 1e3 Step 1
    Next
    Return TimerDiff($t)
    EndFunc
    
    
    Func _01()
    Local $t = TimerInit()
    For $i = 1 To 1e3 Step 1
    Local $a
    Next
    Return TimerDiff($t) - _00()
    EndFunc
    
    
    Func _02()
    Local $t = TimerInit()
    For $i = 1 To 1e3 Step 1
    Local $aaaaa
    Next
    Return TimerDiff($t) - _00()
    EndFunc
    
    
    Func _03()
    Local $t = TimerInit()
    For $i = 1 To 1e3 Step 1
    Local $aaaaaaaaaa
    Next
    Return TimerDiff($t) - _00()
    EndFunc
    
    
    Func _04()
    Local $t = TimerInit(), $a = 0
    For $i = 1 To 1e3 Step 1
    $a = 0
    Next
    Return TimerDiff($t) - _00()
    EndFunc
    
    
    Func _05()
    Local $t = TimerInit(), $a = 0
    For $i = 1 To 1e3 Step 1
    $a += 0
    Next
    Return TimerDiff($t) - _00()
    EndFunc
    
    
    Func _06()
    Local $t = TimerInit(), $a = 1, $b = 1
    For $i = 1 To 1e3 Step 1
    $a += $b
    Next
    Return TimerDiff($t) - _00()
    EndFunc
    
    
    Func _07()
    Local $t = TimerInit(), $a = 1.5, $b = 1.5
    For $i = 1 To 1e3 Step 1
    $a *= $b
    Next
    Return TimerDiff($t) - _00()
    EndFunc
    
    
    Func _08()
    Local $t = TimerInit(), $a = 1.5, $b = 1.5
    For $i = 1 To 1e3 Step 1
    $a /= $b
    Next
    Return TimerDiff($t) - _00()
    EndFunc
    
    
    Func _09()
    Local $t = TimerInit()
    For $i = 1 To 1e3 Step 1
    Next
    Return TimerDiff($t) - _00()
    EndFunc
    
    
    Func _10()
    Local $t = TimerInit()
    For $i = 1 To 1e3 Step 1
    TimerInit()
    Next
    Return TimerDiff($t) - _00()
    EndFunc
    
    
    Func _11()
    Local $t = TimerInit(), $a = 1.5
    For $i = 1 To 1e3 Step 1
    $a = $a ^ 1.01
    Next
    Return TimerDiff($t) - _00()
    EndFunc
    
    
    Func _12()
    Local $t = TimerInit(), $a = 1.5, $b = 1.01
    For $i = 1 To 1e3 Step 1
    $a = $a ^ $b
    Next
    Return TimerDiff($t) - _00()
    EndFunc
    
    
    Func _13()
    Local $t = TimerInit(), $a = 0
    For $i = 1 To 1e3 Step 1
    $a = Sin(3.1415)
    Next
    Return TimerDiff($t) - _00()
    EndFunc
    
    
    Func _14()
    Local $t = TimerInit()
    For $i = 1 To 1e3 Step 1
    Sqrt(5)
    Next
    Return TimerDiff($t) - _00()
    EndFunc
    
    
    Func _15()
    Local $t = TimerInit(), $a = 2
    For $i = 1 To 1e3 Step 1
    $a = Sqrt($a)
    Next
    Return TimerDiff($t) - _00()
    EndFunc
    
    
    Func _16()
    Local $t = TimerInit(), $a = True
    For $i = 1 To 1e3 Step 1
    $a = True
    Next
    Return TimerDiff($t) - _00()
    EndFunc
    
    
    Func _17()
    Local $t = TimerInit(), $a = True
    For $i = 1 To 1e3 Step 1
    $a = Not True
    Next
    Return TimerDiff($t) - _00()
    EndFunc
    
    
    Func _18()
    Local $t = TimerInit(), $a = True
    For $i = 1 To 1e3 Step 1
    $a = True And True
    Next
    Return TimerDiff($t) - _00()
    EndFunc
    
    
    Func _19()
    Local $t = TimerInit(), $a = True
    For $i = 1 To 1e3 Step 1
    $a = True Or True
    Next
    Return TimerDiff($t) - _00()
    EndFunc
    
    
    Func _20()
    Local $t = TimerInit(), $a = 0
    For $i = 1 To 1e3 Step 1
    $a = TimerDiff($t)
    Next
    Return TimerDiff($t) - _00()
    EndFunc
    
    
    Func _21()
    Local $t = TimerInit()
    For $i = 1 To 1e3 Step 1
    TimerDiff(0)
    Next
    Return TimerDiff($t) - _00()
    EndFunc
    
    
    Func _22()
    Local $t = TimerInit(), $a = 0
    For $i = 1 To 1e3 Step 1
    $a = Null
    Next
    Return TimerDiff($t) - _00()
    EndFunc
    
    
    Func _23()
    Local $t = TimerInit(), $a = 0
    For $i = 1 To 1e3 Step 1
    $a = Default
    Next
    Return TimerDiff($t) - _00()
    EndFunc
    
    
    Func _24()
    Local $t = TimerInit()
    For $i = 1 To 1e3 Step 1
    Local $a = 0
    Next
    Return TimerDiff($t) - _00()
    EndFunc
    
    
    Func _25()
    Local $t = TimerInit(), $a = 0
    For $i = 1 To 1e3 Step 1
    $a = Abs
    Next
    Return TimerDiff($t) - _00()
    EndFunc
    
    
    Func _26()
    Local $t = TimerInit(), $a = 0
    For $i = 1 To 1e3 Step 1
    $a = TimerInit
    Next
    Return TimerDiff($t) - _00()
    EndFunc
    Alles anzeigen

    Das liefert sowas hier:

    Code
    Testfunktion         Vorher [ns] Nachher [ns] Diff [ns]
    should be zero      |     0.0   |      1.4   |    1.4  |
    Local $a            |    41.0   |    650.3   |  609.3  |
    Local $aaaaaa       |    43.5   |    650.2   |  606.7  |
    Local $aaaaaaaaaa   |    48.2   |    670.3   |  622.1  |
    Local $a = 0        |   167.5   |    780.6   |  613.1  |
    $a = 0              |   100.8   |    675.1   |  574.3  |
    $a = True           |   110.7   |    682.0   |  571.3  |
    $a = Null           |   348.9   |    913.2   |  564.3  |
    $a = Default        |   349.5   |    917.4   |  567.9  |
    $a = Abs            |   446.7   |   1016.4   |  569.7  |
    $a = TimerInit      |   445.8   |   1015.4   |  569.6  |
    $a += 0             |   103.1   |    677.3   |  574.2  |
    $a += b             |   123.1   |    699.9   |  576.8  |
    $a *= b             |   126.3   |    696.5   |  570.2  |
    $a /= b             |   125.9   |    704.8   |  578.9  |
    TimerInit()         |    66.7   |    645.6   |  578.9  |
    TimerDiff(0)        |   255.6   |    830.0   |  574.4  |
    Sqrt(5)             |   238.2   |    806.5   |  568.3  |
    $a = TimerDiff($t)  |   352.9   |    928.6   |  575.7  |
    $a = $a ^ 1.01      |   479.6   |   1052.2   |  572.6  |
    $a = $a ^ $b        |   497.5   |   1069.1   |  571.6  |
    $a = Sin(3.1415)    |   317.9   |    897.9   |  580.0  |
    $a = Sqrt($a)       |   315.4   |    890.8   |  575.4  |
    $a = Not True       |   183.7   |    757.0   |  573.3  |
    $a = True And True  |   256.3   |    830.9   |  574.6  |
    $a = True Or True   |   181.8   |    757.1   |  575.3  |
    Alles anzeigen

    Ist leider nicht ganz zuverlässig, da AutoIt manchmal "anhaltende" Ruckler die nur bestimmte Funktionen Betreffen (Ich schiele auf Sqrt(5) und Timerdiff(0)), sodass hier manchmal etwas schief läuft. Das übliche "ruckeln" habe ich versucht durch Medianbildung herauszufiltern. In den (Ergebnis)Mittelwert fließt jeweils nur der mittlere Wert von drei (Einzel)Werten ein (Spikes sollten somit abgefangen werden).

    Was man aber ganz klar erkennt: Es ist komplett egal WAS AutoIt ausführt, alles wird Pi mal Daumen um konstante 600ns verzögert. Bei "schnellen" Features macht das natürlich viel aus. Ich hatte ja gehofft eine Quantisierung in der Verlangsamung zu finden (Funktion 1 wird z.B. 2x Elementarverlangsamung langsamer, Funktion 2 wird nur 1x Elementarverlangsamung langsamer, usw. Aber im Endeffekt haben alle den gleichen Wert ;()

  • MsgBox verlangsamt den Skriptablauf unter Win 10

    • Mars
    • 6. April 2020 um 23:45
    Zitat von chesstiger

    Nun, was gewinnen wir an Wissen daraus? Ich bin mir nicht ganz sicher, wie das Ergebnis zu deuten ist. Den ersten Durchlauf hätte ich so gedeutet, dass die "Bremse" AutoIt-Intern sein muss, da kein WinAPI-Aufruf signifikant länger dauert. Und mit AutoIt-Intern meine ich, dass weder eine WinAPI-Funktion langsamer ausgeführt wird als vorher, noch eine WinAPI-Funktion öfter aufgerufen wird als vorher.

    Aber was ich mit dem Ergebnis des zweiten Durchgangs anfangen soll, weiß ich selber noch nicht so ganz...

    Das Problem ist auch, dass ja auch bereits uralte Exe.Dateien langsamer geworden sind. Ich habe z.B. mal mein uraltes Spiel MicroTD ausgepackt, dort habe ich praktischerweise ja eine Framerate/Auslastungsanzeige drin. Das Spiel läuft heute (10 Jahre später) via AutoIt3.exe genauso "flüssig" (also Auslastungsanzeige @60FPS zeigt gleichen Auslastungswert), wie wenn ich die 10 Jahre alte Exe starte. An der Exe hat sich mit 100% Sicherheit nichts geändert. Kann mir nur vorstellen, dass AutoIt intern irgendwelche Schalter (errorchecks, oder ähnliches) hat (diese typischen "should never occur" errors die man zwar im Programm abfängt, aber weiß dass sie niemals auftreten, weshalb man das Errorhandling "so lala" implementiert) die erst seit kurzen von Windows umgelegt werden.

    PS: Deine Ausführungen sind wundervoll :thumbup:

  • MsgBox verlangsamt den Skriptablauf unter Win 10

    • Mars
    • 5. April 2020 um 12:35

    Ja Windows denkt bei jeder in AutoIt geschriebenen Exe, dass es ein Virus ist (ist bei mir genauso), allerdings glaube ich nicht, dass Windows absichtlich irgendwelche Skripte ausbremst. Im Prinzip läuft das Skript ja über die standard AutoIt3.exe und nicht als eigenständiges Programm. Da die AutoIt3.exe nicht vom Defender als Virus eingestuft wird, sollte sie zur Laufzeit auch nicht besonderst stark von ihm beeinflusst werden.

    Edit: Falls jemand Vergleichswerte mit GDI+ will:

    Code
    #include <GDIPlus.au3>
    
    Local $fScore1 = GDIPlusBench()
    Opt('GUIOnEventMode', 1)
    MsgBox(0, '', '')
    Local $fScore2 = GDIPlusBench()
    
    ConsoleWrite(StringFormat('%.2f', $fScore1) & ' (100.00%)' & @CRLF & StringFormat('%.2f', $fScore2) &  ' (' & StringFormat('%.2f', $fScore2/$fScore1*100) & '%)' & @CRLF)
    
    Func GDIPlusBench()
        Local $t = TimerInit()
        _GDIPlus_Startup()
        Local $hBMP = _GDIPlus_BitmapCreateFromScan0(1024, 1024)
        Local $hGFX = _GDIPlus_ImageGetGraphicsContext($hBMP)
        Local $hBRU = _GDIPlus_BrushCreateSolid(), $c
        For $i = 1 To 1e4 Step 1
            $c = Random(0, 255, 1)
            _GDIPlus_BrushSetSolidColor($hBRU, 0xFF000000 + BitShift($c, -16) + BitShift($c, -8) + $c)
            _GDIPlus_GraphicsFillEllipse($hGFX, Random(-75/2, 1024), Random(-75/2, 1024), Random(50, 100), Random(50, 100), $hBRU)
        Next
    ;~     _GDIPlus_ImageSaveToFile($hBMP, Random(10000, 99999, 1) & '.png')
        _GDIPlus_BrushDispose($hBRU)
        _GDIPlus_BitmapDispose($hBMP)
        _GDIPlus_GraphicsDispose($hGFX)
        _GDIPlus_Shutdown()
        Return 430000/TimerDiff($t)
    EndFunc
    Alles anzeigen

    Scheint als würde nur der AutoIt-Teil langsamer werden. Ich komme da auf ca. 70% mit MsgBox + EventMode. Für ein Skript in dem GDI+ den Großteil der Zeit läuft ist also leider kein Faktor 7 drin wenn man die GUI auslagert...

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™