PixelPixelChecksum und Timer

  • Hey :))

    ich brauche Hilfe.
    Und zwar soll das Programm aus einem bestimmten Teil eines Fensters mit
    PixelCheckSum() einen Wert bestimmen mit immer ca 1 sec. unterschied
    zwischen den Abfragen.
    Soweit nicht schwer nur das ganze soll ohne Sleep() sondern mit dem TimerInit() und
    TimerDiff() gemacht werden, damit in der zwischenzeit noch was passieren kann.
    Das will einfach nicht klappen....

    Spoiler anzeigen


    dim $checksum_koords [4]
    $checksum_koords[0]=1002
    $checksum_koords[1]=1070
    $checksum_koords[2]=571
    $checksum_koords[3]=581

    $Timer=TimerInit()
    While 1
    $checksum =PixelChecksum($window[0]+$checksum_koords[0],$window[1]+$checksum_koords[2],
    $window[0]+$checksum_koords[1],$window[1]+$checksum_koords[3])

    If TimerDiff($Timer) > 1000 and $checksum == PixelChecksum($window[0]+$checksum_koords[0],$window[1]+$checksum_koords[2],
    $window[0]+$checksum_koords[1],$window[1]+$checksum_koords[3]) Then
    MsgBox(0,"","")
    EndIf
    WEnd


    Die Zeilenumbrüche in der Funktion dienen nur zur Veranschaulichung!
    Danke für jeden Tipp!

    LG :rock:

    Einmal editiert, zuletzt von zwockel (2. Juni 2012 um 12:12)

  • Dein Problem ist wohl, dass du den Timer nicht zurücksetzt... Nehme ich mal an.

    Spoiler anzeigen
    [autoit]

    dim $checksum_koords [4]
    $checksum_koords[0]=1002
    $checksum_koords[1]=1070
    $checksum_koords[2]=571
    $checksum_koords[3]=581

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

    $Timer=TimerInit()
    While 1
    $checksum =PixelChecksum($window[0]+$checksum_koords[0],$window[1]+$checksum_koords[2], $window[0]+$checksum_koords[1],$window[1]+$checksum_koords[3])

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

    If TimerDiff($Timer) > 1000 Then
    $Timer=TimerInit()
    If $checksum == PixelChecksum($window[0]+$checksum_koords[0],$window[1]+$checksum_koords[2], $window[0]+$checksum_koords[1],$window[1]+$checksum_koords[3]) Then
    MsgBox(0,"","")
    EndIf
    EndIf
    WEnd

    [/autoit]
  • wenn ich das so versuche gibt er mir trotzdem am laufenden Band die msgBoxen aus...

  • Zitat

    wenn ich das so versuche gibt er mir trotzdem am laufenden Band die msgBoxen aus...


    Was soll da auch sonst passieren? Dein Code gibt immer dann eine MsgBox aus, wenn eine Sekunde vergangen ist und die beiden Prüfsummen übereinstimmen (d.h. wenn sich innerhalb von ein paar Millisekunden nichts in dem Bildschirmbereich geändert hat).
    Da die If Abfrage direkt nach dem ersten PixelChecksum kommt, liegt dazwischen nur die Zeit die die zweite PixelChecksum benötigt um einen Wert zurückzugeben (wenige Millisekunden, maximal). Wenn du ein reguläres Fenster damit überwachst, wird sich in dieser Zeit dort nicht viel ändern...

  • Da Timediff den Unterschied in Millisekunden zurückgibt und eine Sekunde 1000 Milisekunden sind ist es klar das die Msgbox ständig kommt.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • ja das weiß ich auch nur meine Frage ist, wie ich es hinbekomme, dass PixelCheckSum in kurzen abständen abgefragt wird aber das ohne den Sleep Befehl

  • dann lass doch sleep einfach weg

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Zitat

    aber das ohne den Sleep Befehl


    Ich verstehe zwar nicht ganz wieso du das willst, aber das geht entweder mit jeder der folgenden Funktionen:

    [autoit]

    _Timer_SetTimer
    AdlibRegister
    TimerInit

    [/autoit]


    Wenn du das mit normalen Timern machen willst, brauchst du eine zusätzlicher Endlosschleife die immer die vergangene Zeit abfragt. Da ist Sleep aber fast effektiver. Und für den Zwecke würde ich auf _Timer_SetTimer oder AdlibRegister zurückgreifen.

    Und die Logik hinter deinen Checksum Vergleichen verstehe ich immer noch nicht. Wieso willst du abfragen ob sich nichts geändert hat (und das auch noch in so kurzen Abständen).

  • das zu erklären ist eigentlich recht leicht:

    man überprüft mit dem CheckSum ein Feld, indem die Koordinaten von etwas stehen, was solange es sich bewegt
    eine Funktion ausführt, jedoch sobald sich die Koordinaten nicht mehr ändern eine MsgBox ausgegeben werden soll.
    Deswegen ist Sleep nicht möglich, da in der Zwischenzeit etwas passieren soll.
    Da jedoch immer etwas Abstand zwischen den einzelnen Checks sein soll soll er immer erst nen gewissen Zeitwert überschritten haben.

    eigentlich nicht schwer...nur die Umsetzung

  • Wenn ich das richtig versteeh, willst du 2 verschiedene Dinge tun lassen. Einmal eine Funktion ausführen wenn sich etwas ändert. Und dann eine MsgBox ausgeben wenn sich nichts ändert.
    Aber: Wie schnell aktualisieren sich diese Koordinaten? So schnell, dass du sicherstellen kannst, dass in ein paar Milliskunden nie 2 mal der selbe Wert ausgelesen wird?
    Und könnte man nicht eine Art Switch Abfrage machen die je nach Cheksum Ergebnis entweder Funktion ausführt oder MsgBox anzeigt?

  • Dafür das nicht innerhalb von wenigen Millisekunden geprüft wird, soll
    eine art Stoppuhr hinzugefügt werden(ich mein das geht mit dem Timer)
    , der immer ganu 1 sekunde zwischen den Messungen abwartet.
    Heißt er fängt an und
    1.nimmt den ersten Checksum-wert
    2.macht dann i was
    3.überprüft ob zwischen jetzt und Schritt 1 min 1 Sekunde liegt
    4. wenn das der Fall ist MsgBox SONST wieder zu schritt 2

  • weil ich wenn ich sleep benutze bei schritt 2 keine beliebige funktion einfügen kann.
    bei sleep macht er genau nichts.
    wenn ich aber eine stoppuhr habe macht er etwas in der zeit

  • Zitat

    könntest mir nen Bsp. zu _Timer_setTimer machen?


    Ich versuchs mal. Ich bin mir leider immer noch nicht sicher wie das nachher aussehen soll.
    Verwendest du eigentlich eine GUI?

    Spoiler anzeigen
    [autoit]

    #include <Timers.au3>

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

    Dim $checksum_koords[4]
    $checksum_koords[0] = 1002
    $checksum_koords[1] = 1070
    $checksum_koords[2] = 571
    $checksum_koords[3] = 581

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

    $hWnd = WinGetHandle(AutoItWinGetTitle())
    $iTimer = _Timer_SetTimer($hWnd, 1000, "_CheckPixels") ;Hier wird die zeit in Millisekunden angegeben, die zwischen den Aufrufen von _CheckPixels gewartet wird

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

    OnAutoItExitRegister("_Shutdown") ;Shutdown beim beenden des Scripts ausführen.

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

    While True
    Sleep(500) ;Do Stuff here...
    WEnd

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

    Func _CheckPixels($hWnd, $Msg, $iIDTimer, $dwTime)
    $checksum = PixelChecksum($window[0] + $checksum_koords[0], $window[1] + $checksum_koords[2], $window[0] + $checksum_koords[1], $window[1] + $checksum_koords[3])
    If $checksum = PixelChecksum($window[0] + $checksum_koords[0], $window[1] + $checksum_koords[2], $window[0] + $checksum_koords[1], $window[1] + $checksum_koords[3]) Then
    MsgBox(0, "", "")
    EndIf
    EndFunc ;==>_CheckPixels

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

    Func _Shutdown()
    _Timer_KillAllTimers($hWnd) ;Muss beim beenden ausgeführt werden, Wichtig!
    EndFunc

    [/autoit]
  • ok habs hinbekommen mit nem Freund zsm

    [autoit]

    Func _dontwait() If PixelChecksum($window[0]+$checksum_koords[0],$window[1]+$checksum_koords[2],$window[0]+$checksum_koords[1],$window[1]+$checksum_koords[3]) <> $last Then $staytime = TimerInit() $last = PixelChecksum($window[0]+$checksum_koords[0],$window[1]+$checksum_koords[2],$window[0]+$checksum_koords[1],$window[1]+$checksum_koords[3]) EndIf If TimerDiff($staytime) > 850 Then Return True Else Return False EndIfEndFunc

    [/autoit]