Do-Funktion um Abbruchkriterium MaxTime erweitern

  • Hallo zusammen,

    da der Zugriff auf die Datenbank manchmal ewig dauert und ich ein Abbruchkriterium setzen möchte, muss folgende Funktion noch erweitert werden:

    [autoit]


    Local $hTimer = TimerInit()
    Do
    Sleep(1000)
    $logastart=PixelSearch(245, 700, 266, 715, 0xDCEEFF)
    Until @error = 0

    [/autoit]

    Mein Versuch funzt leider nicht:

    [autoit]


    Local $hTimer = TimerInit()
    Local $MaxTime = 10 * 70000
    Do
    Sleep(1000)
    $logastart=PixelSearch(245, 700, 266, 715, 0xDCEEFF)
    Until @error = 0 Or If $hTimer > $MaxTime
    $statusCustomer = 0
    $result = $result & 'Customer: ERROR, '
    Else
    $statusCustomer = 1
    $result = $result & 'Customer: OK, '

    [/autoit]

    Kann mir jemand weiterhelfen?

    Vielen Dank!

  • Um was für eine Datenbank handelt es sich denn?
    Wie greifst du auf diese zu?

    Der Aufbau per PixelSearch wirkt hierbei ziemlich skurril.
    Eine vernünftiger Direktzugriff von AutoIt aus, kann die TimeOut-Geschichte schon deutlich anders aussehen lassen.

    Also ein paar mehr Informationen hierzu wären sicherlich geeignet dir schon grundlegend mehr zu helfen, als dich weiter auf einem (vielleicht) falschem Ansatz weiter reiten zu lassen.

  • Damit der Zugriff auf die Datenbank erfolgt, wird eine Suche mit Parametern gestartet. Wenn die Suche dann per Button angestoßen wird, läuft ein Ladebalken. Wenn die Suche abgeschlossen ist, wird die Seite neugeladen und angegebener Pixel gesucht.
    Der Weg muss im Grunde genauso bestehen bleiben, damit ich die exakte Zeit für den Zugriff ausgegeben bekomme. Durch die Suche habe ich keinen direkten Zugriff auf die Datenbank sondern bekomme nur Ergebnisse gefiltert, die meiner vorherigen Suche entsprechen.

  • Ganz ehrlich, das hört sich ziemlich wüst an.

    Was sagt Au3Info zu den Controls der Datenbank/Frontend? Welches Frontend wird überhaupt verwendet? Wieso benutzt du nicht die Control-Funktionen zur Steuerung des Programms? Wieso fragst du nicht die Ladebalken direkt ab?

    Der Weg muss im Grunde genauso bestehen bleiben, damit ich die exakte Zeit für den Zugriff ausgegeben bekomme.

    In deinem Script wird keine exakte Zeit für den Zugriff ausgegeben...

    Wenn die Suche abgeschlossen ist, wird die Seite neugeladen

    Na also, wieso fängst du nicht diese Aktion ab?

  • Ich lasse den Test per WebApp laufen und nutze dafür den IE.
    Wieso ich das bisher noch nicht erwähnt habe, ist mir schleierhaft... X/
    Ich habe also keinen direkten Zugriff auf die Datenbank. Lediglich durch den Anstoß der Suche efolgt ein Zugriff im BackEnd. Weil die App noch nicht ganz rund läuft und die Suche im manchmal im Nirvana landet, soll die Suche nach einer bestimmten Zeit abgebrochen werden.
    Sobald die die Suche läuft, wird die Pixelsuche gestartet und diese läuft so lange bis die Suchergebnisse angezeigt werden.

    Ist es überhaupt möglich die Pixelsuche -so wie ich die verwende- nach einer bestimmten Zeit abbrechen zu lassen?

    Einmal editiert, zuletzt von Mojo (12. Mai 2015 um 01:33)

  • AutoIt
    Local $MaxTime = 700, $hTimer = TimerInit()
    Do
        Sleep(1000)
        $logastart = PixelSearch(245, 700, 266, 715, 0xDCEEFF)
    Until @error = 0 Or TimerDiff($hTimer) > ($MaxTime * 1000)

    Hier mal dein "Do Until" aus deinem Startpost. Leicht abgeändert. Die Deklaration von $MaxTime so abgeändert, dass dort die tatsächlichen Sekunden eingetragen werden kann und
    in Zeile 5 korrigiert (ganz nach dem logischen Ansatzl von @alpines )

  • Vielen Dank! Die Hilfe hier im Forum ist wirklich weltklasse!

    Nachdem mein "Do until" nun meinen Wünschen angepasst wurde, frage ich per If-Anweisung ab, ob der @error die Funktion beendet. Wenn der @error dafür verantwortlich ist, soll das Skript einfach weiterlaufen.

    Für den Fall das der @error nicht dafür verantwortlich ist, soll das Skript abbrechen obwohl weitere Funktionen folgen. Gibt es eine Möglichkeit das Skript dann einfach zu beenden?

    EDIT:
    Wieder total unverständlich...

    So sieht jetzt mein Teilcode aus:

    [autoit]


    Local $hTimer = TimerInit()
    Local $MaxTime = 70
    Do
    Sleep(1000)
    $logastart=PixelSearch(245, 700, 266, 715, 0xDCEEFF)
    Until @error = 0 Or TimerDiff($hTimer) > ($MaxTime * 1000)
    If TimerDiff($hTimer) > ($MaxTime * 1000) Then
    $statusLeague = 0
    $statusTeam = 0
    Else
    $statusLeague = 1
    $result = $result & 'ShowLeague: OK, '
    EndIf
    EndFunc

    [/autoit]

    Sollte "Then" zutreffen, soll mein Skript alle Funktionen die im Anschluss ausgeführt werden, missachten und stattdessen nur meine letzte Funktion ausführen, in der eine Ausgabe stattfindet.
    Ich habe bisher versucht einfach ein simples Call einzubauen aber das funktioniert nicht:

    [autoit]


    If TimerDiff($hTimer) > ($MaxTime * 1000) Then
    $statusLeague = 0
    $statusTeam = 0
    Call ("quitCheck")

    [/autoit]


    Mein zweiter Versuch war alle Prozesse meines quitCheck in "Then" einzubauen aber meine Funktion quitcheck beinhaltet auch wieder eine Schleife und somit funktioniert auch das nicht.

    2 Mal editiert, zuletzt von Mojo (12. Mai 2015 um 15:06)

  • Warum arbeitest du mit Call? Wenn ich in einer If Anweisung Funktionen aufrufen will, dann schreib ich diese einfach hinein. in deinem Fall so:

    Egal welche Bedingung erfüllt wird, also ob das Then oder das Else zutrifft, wird der entsaprechende Bereich der Reihe nach abgearbeitet.

  • Warum ich generell mit Call arbeite?
    Es gibt keine Begründung dafür. Sollte ich davon abweichen, weil es fehleranfälliger ist?

    Bin ein Noobie und deswegen immer sehr froß wenn mir von euch geholfen wird

  • Zitat

    Sollte ich davon abweichen, weil es fehleranfälliger ist?


    Genau das solltest du. ^^
    Sobald du eine Funktion via Call() aufrufst schlägt der Au3Check kein Alarm falls du dich vertippen solltest. Die einzige Möglichkeit um Fehler abzufangen wäre hinter jedem Call() Aufruf eine Error-Abfrage (If @error Then ; …) einzubauen. Wenn du jedoch die Funktion direkt aufrufst (so wie man das eigentlich machen sollte) kann bei einem Tippfehler der Au3Check dies erkennen. Die SciTE warnt dich und du kannst den Fehler sofort berichtigen.

    Es gibt nur ganz wenige Ausnahmefälle wo Call() tatsächlich Sinn macht. Ich habe es bisher tatsächlich nur 2~3 mal gebraucht wo ich einfach nicht drum herum kam. Sollte man also nach Möglichkeit immer vermeiden!

  • Im Grunde habe ich zu jedem Call eine If-Schleife um Fehler zu melden und diese in die Ausgabe zu schreiben.
    Der Test läuft automatisch alle 10min ohne das ein User die Reihenfolge, evtl. Fehler sofort bemerkt und korrigieren kann.
    Also ist das doch dann mit Call sogar gut, oder?

    Wie gesagt, ich bin Noobie aber so wie ich das jetzt verstehe, ist es doch sogar der bessere Weg mit Call in dem Fall oder?

  • Ich glaube du hast nicht verstanden was ich dir damit sagen wollte... :)

    Probier einfach mal folgendes aus, dann siehst du es selber:

    [autoit]

    Global Const $g_sFunc = '_IrgendEinLangerUnoetigerFunktionName'
    Global $g_iCall

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

    $g_iCall = Call($g_sFunc)
    ;~ $g_iCall = _IrgendEinLangerUnoetigerFunktionName()

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

    ConsoleWrite($g_iCall & @CRLF)

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

    Func _IrgendEinLangerUnoetigerFunktionsName()
    Return 7
    EndFunc

    [/autoit]
  • Call hat allgemein kaum Vorteile.
    Fehlerbehandlung kannst du besser ohne machen. Wenn du dich bei einem Call vertippst wird die Funktion einfach nicht aufgerufen -> Fehler. Und dann sitzt du da un suchst ewig deinen Fehler, bis dir irgendwann auffällt, dass du den Funktionsnamen falsch geschrieben hast. -> Warum die Hilfe des Au3Check ablehnen?