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. Andy

Beiträge von Andy

  • Absurder For-Schleifen Verlauf bei floats in 3.3.8.1 (Stable)?

    • Andy
    • 3. August 2013 um 08:44

    Hi,
    das "Problem" ist so alt wie die binäre Darstellung bzw. die Verarbeitung der Gleitkommazahlen, also seit der Erfindung der Prozessoren / Rechner.
    Eine vom Computer verarbeitbare Binärzahl hat nun mal nur eine begrenzte Anzahl Bits zur Verfügung. Innerhalb dieser Anzahl Bits ist nur eine begrenzte Genauigkeit der Berechnung möglich!
    Die meisten "Kommazahlen" sind aber garnicht "genau" binär darstellbar!
    Daher gibt es bei den Prozessoren diverse (einstellbare) Möglichkeiten, die zwangsläufig fehlerbehaftete Berechnung über Rundung zu korrigieren.

    Das führt(e) schon dazu, dass identische Assemblerprogramme nach dem Assemblieren auf verschiedenen Prozessorplatformen zu unterschiedlichen Ergebnissen kamen, weil die Prozessoren nach dem Start das FPU-Control-Word unterschiedlich gesetzt hatten. Dieses Register bestimmt u.a. das Rundungsverhalten und die Genauigkeit der prozessorinternen Berechnung.

    Lustig wird es dann, wenn ein Programm das Controlword für eine beabsichtigt genaue Berechnung/Rundung ändert und danach nicht wieder zurücksetzt....
    Dann bekommt man unterschiedliche Ergebnisse einer Berechnung, nur weil im bspw. zwischenzeitlich zur Entspannung gezockten Spiels der Programmierer das Controlword geändert und nicht auf den ursprünglichen Wert zurückgesetzt hatte :S
    Das Problem hängt dann nicht einmal in der offensichtlich veränderten Genauigkeit, sondern bspw.in völlig veränderten Programmabläufen aufgrund von Vergleichen :wacko:
    Wenn man nach einer Berechnung in einem Programm das Ergebnis so auswertet

    Code
    If (float) a = (float) b then mache irgendetwas


    und immer ermittelt der Prozessor TRUE dann ist alles schick....
    Spielt man zwischendurch Tetris welches das FPU-Control-Word verändert (und nicht wieder zurücksetzt) und danach liefert unser Berechnungsprogramm für die Zeile

    Code
    If (float) a = (float) b then mache irgendetwas

    infolge anderer berechneter Werte plötzlich FALSE, dann hat man ein nicht unerhebliches Problem.....

    Von den "Problemen" bei Wertebereichen der FPU-Register von 80 Bit und dem Speicherbereich eines (single)floats von 32 Bit und eines (double) floats von 64 Bit garnicht zu reden....

    Letztendlich bleibt nur übrig, den "genauen" Wertebereich zu definieren bzw. darzustellen!

    [autoit]

    For $i = 2 to 3.5 Step 0.025
    ConsoleWrite( stringformat("$i = %f", $i) & @LF)
    Next

    [/autoit]

    Voila!

    Die Frage bleibt aber, ob der Prozessor richtig rechnet oder das Ergebnis "richtig" dargestellt wird 8o

  • Array Deklaration als Parameter übergeben

    • Andy
    • 3. August 2013 um 07:24

    Hi,

    Zitat von BugFix

    Ich weiß - aber dann muss man Eval nutzen, was ich möglichst vermeide.

    Eval "muss" man ja nur benutzen, weil "man" zu faul ist, die Zeilen alle untereinander auszuschreiben...

    Spoiler anzeigen
    [autoit]

    Switch @NumParams
    Case 3
    $Ret = DllCall($_KERNEL32DLL, $RetType, $_MFHookApi)
    Case 5
    $Ret = DllCall($_KERNEL32DLL, $RetType, $_MFHookApi, $Type1, $Param1)
    Case 7
    $Ret = DllCall($_KERNEL32DLL, $RetType, $_MFHookApi, $Type1, $Param1, $Type2, $Param2)
    Case 9
    $Ret = DllCall($_KERNEL32DLL, $RetType, $_MFHookApi, $Type1, $Param1, $Type2, $Param2, $Type3, $Param3)
    Case 11
    $Ret = DllCall($_KERNEL32DLL, $RetType, $_MFHookApi, $Type1, $Param1, $Type2, $Param2, $Type3, $Param3, $Type4, $Param4)
    Case 13
    $Ret = DllCall($_KERNEL32DLL, $RetType, $_MFHookApi, $Type1, $Param1, $Type2, $Param2, $Type3, $Param3, $Type4, $Param4, $Type5, $Param5)
    Case Else
    Local $DllCallStr = 'DllCall($_KERNEL32DLL, $RetType, $_MFHookApi', $n = 1
    For $i = 5 To @NumParams Step 2
    $DllCallStr &= ', $Type' & $n & ', $Param' & $n
    $n += 1
    Next
    $DllCallStr &= ')'
    $Ret = Execute($DllCallStr)
    EndSwitch

    [/autoit]
  • ASM SSE shuffle explorer (pshufd shufps ...)

    • Andy
    • 26. Juli 2013 um 20:03
    Zitat

    Das macht doch eigentlich keinen Unterschied, oder!?

    natürlich nicht...hast Recht, und ICH komme ja sowieso damit klar :D

  • ASM SSE shuffle explorer (pshufd shufps ...)

    • Andy
    • 26. Juli 2013 um 19:12

    Hi,
    sehr schön, gehört sicher in Zukunft zum festen Repertoire :thumbup:

    Zitat

    Ganz zu schweigen von der Zeit, die ich vertrödelt hab, nachdem ich wegen eines falschen Hexwertes den restlichen ASM-Code nach Fehlern absuchte

    ....der Debugger in AssembleIt() stellt die SSE-Register richtig dar, gerade beim "shuffeln" hilft mir das immer...wobei ich zugeben muss, dass die GUI des Debuggers nicht wirklich schön ist.
    Gerade die SSE-Register haben wesentlich mehr Platz verdient zur Darstellung der div. Werte (4xfloat, 2x double, 8xword, 4xdword, 128 Bit usw usf...)

    Leider habe ich nicht mal ansatzweise Zeit, den Debugger in AssembleIt2() zu integrieren....


    /EDIT wie wärs damit, Register mit sich selbst zu shuffeln bspw. shufps xmm0,xmm0,0xC8

  • Performance Messung und Script Analyse

    • Andy
    • 25. Juli 2013 um 20:55

    Hi,

    Zitat

    Hast du das Ding mal auf deine Scripte losgelassen und kontrolliert ob alle Funktionen und return statements korrekt erkannt und fehlerfrei ersetzt wurden?

    Habe einige Scripte getestet. Bei den meisten wird zwar die *trace.au3 erstellt, aber das Script läuft nicht durch bzw bleibt mittendrin ab und zu stehen...aber da teste ich noch.

    Zitat

    Jede Programmzeile zu messen halte ich allerdings für übertrieben,

    mit dem von dir vorgestellten Konzept hast du Recht^^

    Zitat

    Was die Prozessorlast anbelangt...

    war nur ein Beispiel. In meinen Scripten "quäle" ich öfter mal das Equipment 8o . Da ist ein Sleep(20) definitiv kontraproduktiv^^. Ich will ja sehen, was die Prozessoren maximal leisten...

    Hast du dir mal "richtige" Profiler angeschaut (von AMD benutze ich bspw. Code Analyst oder CodeXL) ? Dort bekommt man sehr viele verschiedene Informationen, "eigentlich" denkt man, alles sei ok, bis man dann plötzlich merkt dass der Prozessor(core) nur zu 60%ausgelastet ist....aber das wäre für ein AutoIt-Script viel zu viel des Guten :rolleyes:

    Zitat

    Timerinit Timestamps könnten zu ungenau sein um hier eine Zuordnung vorzunehmen, außerdem kann ich ja auch nicht 1000 Lastmessungen pro Sekunde machen und viele Funktionen laufen in weniger als 1ms durch.

    Die Timestamps lösen wesentlich höher (niedriger ? ) auf als 1 ms. Was du nicht verhindern kannst, ist dass dir Windows und die anderen Programme einen Strich durch die Rechnung machen! Daher wäre es ggf. sinnvoll, die Prozesspriorität für den "Testlauf" auf maximum zu stellen, damit dir keine Querschläger durch die anderen Prozesse das Messergebnis verfälschen.
    Sobald nur etwas Last auf dem Bus ist, bricht die Performance der AutoItscripte massiv ein, typisch Interpreter..

  • Ich brauche ein Autoradio - kann mir jemand helfen?

    • Andy
    • 25. Juli 2013 um 07:37

    Hi,
    wenn man mal den ganzen technischen Schnickschack weglässt, und das "Radio" auf seine "Usability" herunterbricht, kann man es sehr gut mit einem optimalen ( ? ! ) Programm vergleichen!
    Der ganze technische Kram ist VÖLLIG unerheblich, wenn man das Gerät nicht blind bedienen kann.

    Früher mal habe ich mir immer den Spass gemacht, die Radio-Spezialisten in den Fachgeschäften genau in diesem Punkt auflaufen zu lassen!
    Ich hatte einen VW-Käfer, Baujahr 1969, und wollte ein "Radio" erwerben. Das Orginal-Radio hatte ich dabei. Es hatte einen großen gummierten Drehregler rechts für´s Ein- und Ausschalten und die Lautstärke, rechts nen Regler für die Senderwahl und 5 "Programmtasten" um die Radiostation zu speichern.
    Bedienung erfolgte definitiv "blind", also ohne hinzuschauen. Nicht nur nachts , sondern auch im (ja, das war mal einige Jahre so) Rallye-Einsatz.
    Zurück zu den "Fachverkäufern" :D
    Die mussten natürlich ob meines "Geräts" immer lachen, ich habe immer erklärt, dass der Preis des neuen Geräts absolut keine Rolle spielt!
    Zum Vergleich habe ich gebeten, mein Radio in eine der Testkonsolen einzubauen, damit man den "Sound" besser vergleichen kann 8o
    Gezeigt wurden mir dann die High-End-Geräte von Ken**** Pio**** uswusf.
    Ich tat begeistert, und habe mir diese Errungenschaften der Hightech dann vorführen lassen. Nach ca. 3 vorgeführten Geräten, habe ich dann in die Hosentasche gegriffen und eines der ersten dieser Mini-Handheld-Computerspiele herausgeholt und den Verkäufer gebeten, das Spiel zu spielen.
    Es war eins dieser Autospiele, bei dem man nicht von der Strasse abweichen darf :D
    Der war natürlich perplex, hat es aber gemacht, und mitten beim Spielen hab ich dann gesagt, "Schalten Sie mal bitte das Radio ein..."
    Spätestens 2 Sekunden später kam wildes Gepiepse aus dem Handheld, "Game over". NIE, und ich betone NIE, hat es einer dieser "Fachverkäufer" geschafft, eines der Higtech-Geräte zu bedienen, ohne einen "Fahrfehler" zu machen.
    Die meisten haben sofort verstanden worauf ich hinauswollte, sind zum Käfer-Radio mit den 2 Bedienelementen gegangen, und haben dieses Gerät auch ohne "Game-Over" bedienen können...
    Ein Verkäufer eines Blaupunkt-Fachgeschäftes hat sich sogar einmal artig bedankt und versprochen, die Anregung an Blaupunkt weiterzugeben.....einige Jahre später habe ich mal ein Blaupunkt-Radio in "Retro" gesehen, es muss wohl einen Markt für "Usability" geben^^

    Warum schreibe ich wieder so lange Geschichten?
    Heute, 20-30 Jahre später, hat sich NICHTS geändert.
    Wir haben neulich einen (jüngeren) Bekannten im Krankenhaus besucht, der mit seiner Freundin einen schweren Autounfall hatte. Der Junge hat Glück gehabt, seine Freundin nicht. Grund für den Unfall war lt. eigenen Angaben "Rumspielen" am "Radio" während der Fahrt. Das Gerät gehört übrigens in die 1000€-Klasse!
    Wenn ich dazu noch sehe, wieviele Leute selbst in High-End Fahrzeugen mit nem Handy in der Hand telefonieren, obwohl es Freisprecheinrichtungen für nen Knopp und nen Klicker gibt, dann verstehe ich ehrlich gesagt die Welt nicht mehr...

  • Performance Messung und Script Analyse

    • Andy
    • 25. Juli 2013 um 06:55

    Hi,
    nette Idee, einen Profiler zu schreiben!

    Die Kunst ist aber nicht, die Daten in ein Logfile zu schreiben, sondern hilfreich auszuwerten.
    Es müsste also eine Art Tabelle oder Diagramm geben, in dem man sofort ablesen kann, in welcher Funktion im Verhältnis zu Programmlaufzeit die
    - meiste Zeit
    - höchste Aufruffrequenz
    - höchste Prozessorlast
    - uswusf.
    festgestellt wurde. Das sind dann die sog. "Hotspots".

    Wenn das für die Funktion hinhaut, sollte man definitiv die "loops" (For/To While/Wend usw) mit einbeziehen.
    "Richtige" Profiler werten die Laufzeit jeder einzelnen Programmzeile aus. Damit ist dann auch ein direkter Verweis in den Quellcode machbar
    Anhand dieser Ergebnisse ist dann auf einen Blick erkennbar, in welcher Schleife die meiste Zeit verbracht wurde. Und dort kann man dann anfangen den Code zu optimieren....

  • GUICtrlCreateGroup - Rahmenfarbe ändern

    • Andy
    • 20. Juli 2013 um 20:40
    Zitat

    Bei dem Eigenbau ist das nicht der Fall.

    Wenn man schon einen Eigenbau bastelt, der wie eine Groupbox aussieht, kann man nebenbei auch gleich die von dir genannte Eigenschaft reinpfriemeln. Und das alles wg. einem bunten Rähmchen.....

  • Case Schritt wechseln

    • Andy
    • 20. Juli 2013 um 10:49
    Zitat

    Er ist ja halt noch in der Schleife drin. Wie soll er dann dazu kommen GUIGetMsg abzufragen???

    hmmm, ja wie auch? Indem er überhaupt erstmal peilt, wie ein Programm funktioniert!
    Indem realisiert wird, dass ein Programm Zeilen nacheinander abarbeitet und somit auch Ereignisse auch nur nacheinander abgefangen werden können!

    Zitat

    Vielleicht macht bei dir der OnEvent-Mode mehr Sinn, als der MessageLoop-Mode.

    :D made my day...
    Das fällt immerhin schon im 19. Post auf :rock:

    Aber das war garnicht die Fragestellung bzw. die Lösung zum Problem!

    Zitat

    Eigentlich sollte das Programm in einen andern case Schritt springen ($zaehler =0). Betätige ich das „X“ passiert zunächst auch nichts, erst wenn alle Durchläufe vorbei sind geht dann das
    Fenster zu wie ein quasi „ gespeichertes“ Kommando...........Irgendwie muss ich
    doch vorher aus dem case schritt aussteigen können.

    Die Fragestellung wurde beantwortet, das Programmtechnische Problem gelöst, aber das Script ist immer noch MÜLL, weil das gesamte Konzept in der Kombination von SLEEP() mit GUIGETMSG() garnicht funktionieren kann!
    Und wieso ist er auf diese Erkenntnis nicht schon viel früher gekommen?
    Weil die Hilfe zu Sleep()

    Zitat von Hilfe zu Sleep()

    Pausiert die Skript Ausführung.

    völlig ignoriert wurde...

  • Case Schritt wechseln

    • Andy
    • 20. Juli 2013 um 10:23

    Hi,

    Zitat

    Also ich möchte das das Programm nach einer einstellbaren Zeit einen tastendruck oder mausclick ausführt.

    Bot?
    BotBotBotBotBot....

    Ansonsten ist das Script leider wieder einmal der typische Fall von "Handbooknotreaderror"!

    Weder irgendwelche Kommentare, so dass man nur ansatzweise erkennen könnte, was überhaupt beabsichtigt ist, noch irgendwelche Möglichkeiten oder auch nur Ansätze von Debugging(versuchen)!

    Zitat

    Gut wäre noch wenn die Zeit bis zur nächsten Aktion als Countdown angezeigt würde.


    Hier soll wieder mal nach 278 Push-Postings "der Arm aus der Sonne gelegt werden"! :thumbdown:

    Was soll das hier?

    [autoit]

    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE

    [/autoit]

    Besteht auch nur entfernt die Möglichkeit, den Event- bzw. Message-code abzufragen?

    [autoit]

    GUIGetMsg($btn_Stopp)

    [/autoit]

    ...was sagt denn die Hilfe zu GuiGetMsg() ?

    [autoit]

    Sleep($Gesamtzeit)

    [/autoit]

    ...was sagt denn die Hilfe zu Sleep() ?

    Zitat

    warum igrnoriert das prog dann alles nachstehende während es in der shcleife ist?

    Na wieso guckst du nicht einfach in deinem Programm, warum das so ist?
    Genau deshalb wurden die Möglichkeiten gegeben, Daten in die Console oder auch in einfache Messageboxen auszugeben.
    Ich wette, du hast KEINE Ahnung, wie dein Programmcode überhaupt abgearbeitet wird!
    Du stellt Vermutungen an und wenn diese nicht erfüllt werden, wird ein "Hilfe"-Thread gepostet...

    Was glaubst du, machen andere Leute mit deinem Code bzw. wie werden Lösungen erarbeitet? Draufgucken und die "richtigen Befehle" eintippern? :rofl:
    Dein "Programm" muss Zeile für Zeile abgearbeitet und analysiert weden. DU hast das noch kein einziges mal mit den dafür vorgesehenen Hilfsmitteln gemacht! Das erkennt man allein an der Anordnung der Zeilen!
    Wenn du nicht weisst, wie man Programme analysiert bzw. "Fehler" findet, wieso fragst du dann nicht danach, statt einfach irgendwelchen Schrott zu posten und andere diesen Mist dann auseinanderklabustern zu lassen?

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $count = 0, $Start = 0, $Anzahl = 0, $MaxVarianz = 0, $Basiszeit = 0, $Varianz = 0 ; $Gesamttzeit = $Basiszeit + $Varianz
    Global $Tastatur = 0, $Maus = 0, $Random = 0, $CD = 0, $VarianzVoll = 0, $zaehler = 0

    [/autoit] [autoit][/autoit] [autoit]

    HotKeySet("{F2}", "_Exit")

    [/autoit] [autoit][/autoit] [autoit]

    GUICreate("irgendwas", 360, 570)
    GUISetBkColor("0xFFFFCA")
    $lbl_count = GUICtrlCreateLabel("Versuche bisher: 0", 10, 50, 200, 20)
    $lbl_Ist = GUICtrlCreateLabel("IST", 130, 90, 200, 17)
    $lbl_Soll = GUICtrlCreateLabel("Soll", 280, 90, 200, 17)
    $lbl_Anzahl = GUICtrlCreateLabel("Anzahl Läufe: 0", 10, 120, 200, 17)
    $lbl_Basiszeit = GUICtrlCreateLabel("Basiszeit: 0", 10, 160, 200, 17)
    $lbl_Varianz = GUICtrlCreateLabel("Varianz (größer 300): 0", 10, 200, 200, 17)
    $lbl_Gesamtzeit = GUICtrlCreateLabel("Gesamtzeit:", 10, 240, 200, 17)
    $lbl_zeit_laufend = GUICtrlCreateLabel("Zeit zum nächsten click: 0", 10, 280, 200, 17)
    $lbl_Testfeld = GUICtrlCreateLabel("Cursor in das Testfeld:", 10, 370, 200, 17)
    $lbl_Testbutton = GUICtrlCreateLabel("Cursor auf den Testbutton:", 10, 330, 200, 17)
    $lbl_Tastatur = GUICtrlCreateLabel("Eingabe 1 für Tastatur (1 Taste):", 10, 460, 200, 17)
    $lbl_Maus = GUICtrlCreateLabel("Eingabe 1 für Maus:", 10, 500, 200, 17)
    $lbl_Random = GUICtrlCreateLabel("Eingabe 1 für Random:", 10, 540, 200, 17)
    $lbl_Aktiv = GUICtrlCreateLabel("Nur eins kann aktiv sein!", 10, 420, 200, 17)
    $Input1 = GUICtrlCreateInput("20000", 260, 120, 70, 20)
    $Input2 = GUICtrlCreateInput("100", 260, 160, 70, 20)
    $Input3 = GUICtrlCreateInput("400", 260, 200, 70, 20)
    $Input4 = GUICtrlCreateInput("", 260, 380, 70, 20)
    $Input5 = GUICtrlCreateInput("0", 260, 460, 70, 20)
    $Input6 = GUICtrlCreateInput("1", 260, 500, 70, 20)
    $Input7 = GUICtrlCreateInput("0", 260, 540, 70, 20)
    $btn_Start = GUICtrlCreateButton("Start", 110, 10, 60, 20)
    $btn_Stopp = GUICtrlCreateButton("Stopp", 190, 10, 60, 20)
    $btn_NULL = GUICtrlCreateButton("NULL", 270, 10, 60, 20)
    $btn_Test = GUICtrlCreateButton("Test", 260, 330, 60, 20)
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $msg=GUIGetMsg()
    ;msg nur anzeigen, wenn <>0
    if $msg<>0 and $msg<>-11 then ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $msg = ' & $msg & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
    Switch $msg
    Case $GUI_EVENT_CLOSE
    _Exit()

    [/autoit] [autoit][/autoit] [autoit]

    Case $btn_Start
    ;msgbox nur eine sekunde anzeigen
    MsgBox(262144,'Debug line ~' & @ScriptLineNumber,'Selection:' & @lf & '$btn_Start' & @lf & @lf & 'Return:' & @lf & $btn_Start,1) ;### Debug MSGBOX

    [/autoit] [autoit][/autoit] [autoit]

    $Anzahl = GUICtrlRead($Input1)
    $Basiszeit = GUICtrlRead($Input2)
    $MaxVarianz = GUICtrlRead($Input3)
    $Tastatur = GUICtrlRead($Input5)
    $Maus = GUICtrlRead($Input6)
    $Random = GUICtrlRead($Input7)

    [/autoit] [autoit][/autoit] [autoit]

    GUICtrlSetData($lbl_Anzahl, "Anzahl Läufe: " & $Anzahl)
    GUICtrlSetData($lbl_Basiszeit, "Basiszeit: " & $Basiszeit)

    [/autoit] [autoit][/autoit] [autoit]

    While $count < $Anzahl

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $count = $count + 1
    $VarianzVoll = Random(300, $MaxVarianz, 0)
    $Varianz = Round($VarianzVoll, 3)
    $Gesamtzeit = $Basiszeit + $Varianz
    Sleep($Gesamtzeit)

    [/autoit] [autoit][/autoit] [autoit]

    ;Send ("1")

    [/autoit] [autoit][/autoit] [autoit]

    GUICtrlSetData($lbl_count, "Versuche bisher: " & $count)
    GUICtrlSetData($lbl_Gesamtzeit, "Gesamtzeit: " & $Gesamtzeit)
    GUICtrlSetData($lbl_Varianz, "Varianz (größer 300): " & $Varianz)

    [/autoit] [autoit][/autoit] [autoit]

    $msg1=guigetmsg() ;buttons abfragen, Button muss midestens $Gesamtzeit gedrückt sein bevor release!!!!!
    if $msg1<>0 and $msg1<>-11 then ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $msg1 = ' & $msg1 & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
    if $msg1=$btn_Stopp then ExitLoop ;wenn Stop gedrückt, dann schleife verlassen
    if $msg1=$GUI_EVENT_CLOSE then _Exit()

    [/autoit] [autoit][/autoit] [autoit]

    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Case $btn_NULL
    MsgBox(262144,'Debug line ~' & @ScriptLineNumber,'Selection:' & @lf & '$btn_NULL' & @lf & @lf & 'Return:' & @lf & $btn_NULL) ;### Debug MSGBOX

    [/autoit] [autoit][/autoit] [autoit]

    $count = 0
    $Start = 0
    $Anzahl = 0
    $Basiszeit = 0
    $Varianz = 0

    [/autoit] [autoit][/autoit] [autoit]

    GUICtrlSetData($lbl_count, "Versuche bisher: " & $count)
    GUICtrlSetData($lbl_Anzahl, "Anzahl Läufe: " & $Anzahl)
    GUICtrlSetData($lbl_Basiszeit, "Basiszeit: " & $Basiszeit)
    GUICtrlSetData($lbl_Varianz, "Varianz (größer 300): " & $Varianz)

    [/autoit] [autoit][/autoit] [autoit]

    Case $btn_Stopp
    MsgBox(262144,'Debug line ~' & @ScriptLineNumber,'Selection:' & @lf & '$btn_Stopp' & @lf & @lf & 'Return:' & @lf & $btn_Stopp) ;### Debug MSGBOX

    [/autoit] [autoit][/autoit] [autoit]

    _Exit()

    [/autoit] [autoit][/autoit] [autoit]

    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _Zaehler()
    ;Inhalt
    EndFunc ;==>_Zaehler

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _Exit()
    MsgBox(262144,'Debug line ~' & @ScriptLineNumber,'Selection:' & @lf & '_Exit' & @lf & @lf & 'Return:' & @lf ) ;### Debug MSGBOX
    Exit
    EndFunc ;==>_Exit

    [/autoit] [autoit][/autoit] [autoit][/autoit]
  • OpenCV meets AutoIt

    • Andy
    • 19. Juli 2013 um 20:58

    Hi,
    habe mal einen schnellen workaround gebastelt.

    Spoiler anzeigen
    [autoit]

    Func _Resize()
    Local $_iValue = GUICtrlRead($cSlider)
    If $_iValue = 0 Then
    $_iValue = 1
    GUICtrlSetData($cSlider, $_iValue)
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    GUICtrlSetData($cSliderVal, $_iValue & " %")
    $tImage = _OpenCV_LoadImage($testimage)
    Local $_iWidth = DllStructGetData($tImage, "width")
    Local $_iChannels = DllStructGetData($tImage, "nChannels")
    $b=int($_ivalue*$_iWidth/100) ;breite
    $padding=mod($b,4);padding-Pixel zu durch 4 teilbare breite

    [/autoit] [autoit][/autoit] [autoit]

    if $padding=2 or $padding =3 Then
    $_iValue=($b+4-$padding)*100/$_iWidth
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    _OpenCV_Resize($tImage, $_iValue)
    $hBitmap = _CreateBitmapFromIplImage($tImage)
    _WinAPI_DeleteObject(GUICtrlSendMsg($cPic, 0x0172, 0, $hBitmap))
    EndFunc

    [/autoit]


    Du musst beim ersten Laden des Bildes schon auf die Breite achten....
    Kann gut sein, dass diese geschwindigkeitsoptimierte Bibliothek nur Bilder mit einer durch 4 teilbaren Breite verarbeitet, alles andere wäre imho auch Quatsch (man würde wg fehlender SIMD nur auf 25% der möglichen Geschwindigkeit rechnen)

  • Bewegungsmelder

    • Andy
    • 19. Juli 2013 um 18:06

    Hi,

    alles gut und schön, und mit "richtigen" Kameras (bzw. Sensoren) auch irgendwie machbar. (habe Lösungen für Kameras der >>1000€-Klasse umgesetzt)

    Aber mit einer "Webcam"?
    Selbst im Schwarzweiß-Modus ist das Rauschen so stark, dass man unmöglich einzelne Pixel sinnvoll auswerten kann. Daher BugFix´ens Tip, die kameraeigene Software zu nehmen, die bügelt nämlich etliche Filter über die verkorksten Bilder, damit die wenigstens halbwegs ordentlich aussehen...

    Im "Normalfall" (schlechte Beleuchtung/Lichtverhältnisse) sind Streuungen von 50% im Bereich der "Farben" bzw Grautöne keine Seltenheit!
    Daher ist die Methode von Aspirin-Junkie ist zwar relativ aufwendig, garantiert aber, dass Ergebisse in bestimmter Qualität zu erwarten sind.
    Ansonsten muss mit den Filtern weiter experimentiert werden!

    Pixelchecksum() und anderes "Bot"-Gedöns kann man sich getrost abschminken, das funktioniert nicht mal bei Fernsehkameras der 500k-€-Klasse^^ (raw-Format)
    Es ist wie immer im Leben, um aus Sch*** Gold zu machen, muss man tieeef in die Trickkiste greifen ;)
    Je höher die Auflösung der Cam, desto empfindlicher ist der Sensor gegen (das physikalisch bedingte) Rauschen. Ich habe anfangs ziemlich gute Ergebnisse mit einer alten IXUS X2 als Webcam-ersatz erzielt.
    Ein "riesen" Sensor mit geringer Auflösung :D => wenig Rauschen , einfache = schnelle Filter und Echtzeitanalyse ist auch mit AutoIt machbar:D

  • AutoIt Versions-Archiv und Diskussionsthread (3.3.8.1 bis 3.3.10.2, Stand 30.12.13)

    • Andy
    • 18. Juli 2013 um 21:02

    Bei mir XP32 ist die 8.0 (jaja, die verwende ich..) wesentlich schneller als die 9.5!
    Dein Bench läuft mit 48 zu 36 (8.0 bei 100%) genau 1/3 langsamer....das sind 33%!!
    Wobei der Bench Nr. 3 völlig aus dem Ruder läuft....alle anderen sind ca. 20% langsamer, Nr. 3 ist ca. DOPPELT so langsam (dauert also doppelt so lange!)

  • OpenCV meets AutoIt

    • Andy
    • 18. Juli 2013 um 20:46

    Nimm mal ein anderes Bild, bzw. verkleinere (vergrößere) dein Bild mal auf eine durch 4 teilbare Breite! Teste div. Bit-Formate
    Wenn das nicht funktioniert, erzwinge Padding durch eine durch 3 teilbare Breite.

    Wenn das dann immer noch nicht funktioniert, lese das Bild pixelweise aus (struct? ) und schaue nach, was da "schief" läuft ^^

  • OpenCV meets AutoIt

    • Andy
    • 18. Juli 2013 um 20:35

    Hi,
    könnte sein, dass das etwas mit dem sog. Padding, also Auffüllen mit Nullbytes am Ende einer Bitmapzeile, zu tun hat.

    Die Zeilenlänge einer Bitmap (Bildbreite) muss ein durch 4 Bytes teilbarer Wert sein, dass ist bei einem 32-Bit-Farbformat ARGB zwangsläufig so, da jedes Pixel aus 4 Bytes besteht.
    Bei einem 24-Bit-Format (RGB) MUSS die Zeilenbreite durch 4 Bytes teilbar sein.
    Bsp Bildbreite = 6 Pixel, Höhe 4 Pixel, 24-Bit-Format
    24 Bit sind 3 Bytes....
    Anzahl Bytes in dieser Zeile ist 6 Pixel * 3 Byte(24 Bit) = 18 Bytes.
    Der nächstgrößere durch 4 Teilbare Wert ist 20 Bytes. Bis zu dem 20. Byte wird mit Nullbytes aufgefüllt.
    Also sieht die Zeile so aus, 20 Bytes lang:
    RGBRGBRGBRGBRGBRGB00

    Das Komplette Bild als Bitmap
    RGBRGBRGBRGBRGBRGB00
    RGBRGBRGBRGBRGBRGB00
    RGBRGBRGBRGBRGBRGB00
    RGBRGBRGBRGBRGBRGB00


    Einige Bildbearbeitungsprogramme bzw. Bildberechner fangen einen solchen "Fehler" aber nicht ab, bzw. gehen aufgrund von div. Filteralgorithmen davon aus, dass die Bilder eine durch 4 teilbare Breite haben. Dann wird von einem 32-Bitformat ausgegangen, obwohl nur ein 24-Bitformat im Bild real vorhanden ist. Was dann dazu führt, dass das letzte "Pixel" in der Zeile "aufgeteilt" wird, bzw, in die nächste Zeile verschoben wird....klaro?

    Dann wird aus unserem Beispiel oben OHNE Padding (16 Bytes breite)
    RGBRGBRGBRGBRGBR
    GBRGBRGBRGBRGBRG
    BRGBRGBRGBRGBRGB
    RGBRGBRGBRGBRGBR
    GBRGBRGB

    Zitat

    scheint die Breite des Zielbildes etwa 1 Pixel (damit meine ich Farbkanalpixel - kein Ganzpixel) kleiner ist als das zu schreibende Bild.


    Da hat dann jemand gemeint, aus 32-Bit ARGB ein 24-Bit RGB machen zu können, indem man einfach den Alphakanal "weglässt". Und ohne Padding bzw Anfügen der Nullbytes am Ende der Zeile führt das zu o.g. Problem.

  • Binär Hilfe

    • Andy
    • 15. Juli 2013 um 06:28

    ...ich dachte eher an so etwas...

    [autoit]

    $a="0x024A0007006B0069006E0067005F006200650009006C006F00630061006C0068006F00730074";000063DD"
    $b=binarytostring($a,3)
    ConsoleWrite( ' $b = ' & $b & @crlf & @crlf) ;### Debug Console

    [/autoit]
  • Binär Hilfe

    • Andy
    • 14. Juli 2013 um 23:08

    Hi,

    Zitat

    Wenn ich "0x024A0007006B0069006E0067005F006200650009006C006F00630061006C0068006F00730074000063DD" von Binär zu String mache
    kommt "J" raus.


    wenn ich das mache, bekomme ich

    Code
    king_be	localhost
  • Caesar Decoder

    • Andy
    • 13. Juli 2013 um 22:24

    Ihr wollt mich veräppeln! 8|
    Oder ihr denkt viel zu kompliziert....

  • Caesar Decoder

    • Andy
    • 13. Juli 2013 um 22:11

    Das ist so ziemlich die einfachste "Geheimschrift" ever...wenn man weiss, wie man sie lesen muss :rofl:
    So haben wir früher in der Schule (>>30 Jahre her) per Zettelchen kommuniziert...

    Tja, auch für SMS könnte man das brauchen, müsste nur was fürs Schreiben her, LESEN kann man das nämlich "on the fly" :D (da ist rein GARNICHTS verschlüsselt)

  • Caesar Decoder

    • Andy
    • 13. Juli 2013 um 18:49

    edO öknamr onetnn eretiewniech hafreVs dnewnaner ne!

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™