neues wissen neue frage --> warten auf situation

  • ich habe das mit dem send-befehl hingekriegt, aber...

    ...falls irgendwann während der abarbeitung meiner while schleife ein erro auftaucht soll das programm druck drücken, paint öffnen...
    mein problem ist:
    ich habe eine while schleife die immer auf true steht.
    wenn ein error erscheint müsste die schleife beendet werden und der rest des programms ausgeführt werden

    [autoit]

    while 1
    ...
    WEnd
    ; error passiert

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

    Sleep(30000)
    Send("{PRINTSCREEN}")
    ShellExecute("%windir%\system32\mspaint.exe")
    Sleep(2000)
    WinWait("Unbenannt - Paint")
    WinActivate("Unbenannt - Paint")
    WinWaitActive("Unbenannt - Paint")
    Send("^v")

    [/autoit]

    bei fragen (über formulierung) bitte schreiben, da ich dringend eine antwort brauche

    Einmal editiert, zuletzt von robertmaxity (17. Juli 2011 um 16:00)

  • Wenn du einen Screenshot vom Desktop machen willst, tu das doch per _ScreenCapture_Capture

    Und wie meinst du das mit Error? Crasht das Autoit Script oder was?

    PS: Die Schleife beendest du mit ExitLoop

  • Ich denke dieses Beispiel sollte den Testfall abdecken:

    Spoiler anzeigen
    [autoit]

    #Include <ScreenCapture.au3>

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

    $dateiname = "Errorpic" ; Dateiname
    $id = 1 ; Dateiid

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

    $keinFehler = True; noch gibt es keinen fehler

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

    HotKeySet("{1}","errortest")
    Func errortest()
    $keinFehler = False ; Fehler wird aktiviert
    EndFunc
    #cs
    Dient der Demonstration: Wenn "1" gedrückt wird, dann wird ein Fehler simuliert
    Später sollte dein Programm in der while schleife den Fehlercode setzen
    #ce

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

    While true
    ; ...hier würde dein Code stehen
    Sleep(10)
    ;...
    If $keinFehler = False Then ExitLoop
    WEnd

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

    #cs
    Alternative

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

    while $keinFehler
    ...
    wend

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

    #ce

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

    While FileExists(@ScriptDir&"\"&$dateiname&$id&".jpg") ; solange Datei existiert=> erhöhe id
    $id += 1
    WEnd

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

    _ScreenCapture_Capture(@ScriptDir&"\"&$dateiname&$id&".jpg") ; speichert den Screenshot im aktuellen Verzeichnis

    [/autoit]

    Wer immer nur das tut, was er bereits kann - wird auch immer nur das bleiben, was er bereits ist!

  • 1. danke für eure schnelle hilfe aber ich glaube ich habe mich falsch ausgedrückt
    2. das programm beginnt mit while 1
    dann werden an die hundert zeilen durchgearbeitet und zwischen jeder funktion kann ein fehler auftreten, was bedeuten würde (@XovoxKingdom), dass ich nach jeder zeile einmal schreiben müsste:

    [autoit]

    If $keinFehler = False Then Endloop

    [/autoit]


    und ich wil wissen ob ich irgentwie einstellen kann, dass wenn die funktion länger als 30sek inaktiv ist, dass er (a) die schleife beendet (b) ein foto mach in paint einfügt und speichert (nicht das problem) und (c) die schleife von vorne anfängt (auch nicht das problem)

  • Hmm.. spontan würde mir da nur eine Lösung via Threads einfallen:
    Es müsste ein Thread gestartet werden, der die Laufzeit einer Funktion misst und diese
    nach dem Abbruchkriterium vom 30sek. zum Terminieren forciert.
    Threads sind mir allerdings in AutoIt nicht bekannt :S
    Es gab/gibt jedoch ein paar Themen dazu -> einfach mal googlen.

    Anders wäre es glaub ich nicht möglich die Laufzeit eines Algorithmus zu bestimmen,
    ohne nach (unglaublich) vielen (und möglichst) kleinen Berechnungsschritten die Prüfung vorzunehmen.

    Obwohl ich deinen bisherigen Code nicht kenne, würde ich dir eine Modularisierung von Codeblöcken vorschlagen,
    die kurze Anweisungsschritte haben und somit schnell terminieren können, oder andernfalls notgedrungen einen
    @error werfen können.

    Ich muss zugeben, dass die ständige Überprüfung der Variablen nicht so schön ist.

    Letzter Einfall: Adlibregister
    Du kannst in einer Variablen die aktuelle Position (Funktionsname) speichern und bei einem
    error die Funktion speichern, damit du später diesen Fehler beheben kannst.
    Die Zeitmessung von 30 Sekunden kannst du damit auch realisieren, indem du beim ersten
    Funktionsaufruf TimerInit() startest und bei allen Folgeaufrufen bis 30 Sek die Zeit prüfst.
    Danach muss TimerInit() erneut aufgerufen werden ...

    Vielleicht hilft dir der eine oder andere Tipp weiter ;)

    Wer immer nur das tut, was er bereits kann - wird auch immer nur das bleiben, was er bereits ist!

  • gut ich habe jetzt eine lösung

    vielen dank an alle beteiligten

    eine letze frage:
    wenn ich in autoit funktionen (func)
    mache
    wie rufe ich die auf

    so hier ???

    [autoit]

    func func1
    code code
    Endfunc
    func func2 ($zahl)
    code code
    Endfunc

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

    func1
    func2(7)

    [/autoit]
  • Einfach den Funktionsnamen hinschreiben, wie bei normalen Autoit Funktionen auch:

    [autoit]


    _Text("Der Text der dann gezeigt wird")

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

    Func _Text($txt)
    Msgbox(64,"Text:",$txt)
    Endfunc

    [/autoit]
  • kann mir jmnd den code für diesen satz geben:
    wenn (if???) du länger als 30 sek warten musst, dann beende die schleife (enndLoop) ...

  • gut danke
    funktioniert
    aber noch eine reine interessensfrage
    gibt es ein makro oder eine funktion die erkennt, welches fenster im vordergrund ist

  • ich habe jetzt die funktion:

    [autoit]

    Func errorSearch ()
    If Wingettitle("[Active]") = "[Fehlernachricht] - Windows Internet Explorer" Or WinGetTitle("[Active]") = "[website: Warnung] - Windows Internet Explorer" Then
    return True
    Else
    return false
    EndIf
    EndFunc

    [/autoit]

    und im script so eingebaut

    [autoit]

    While True
    ...
    errorSearch()
    If errorSearch() = True Then
    ExitLoop
    Else
    EndIf
    ...
    WEnd

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

    Send("{PRINTSCREEN}")
    ShellExecute("mspaint.exe")
    ...

    [/autoit]

    wenn ich das ausführe und für einen error sorge passiert nichts

    versteht ihr wieso

  • Warum machst du es nicht einfach direkt über die Schleife?

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

    While 1
    If Wingettitle("[Active]") = "[Fehlernachricht] - Windows Internet Explorer" Or WinGetTitle("[Active]") = "[website: Warnung] - Windows Internet Explorer" Then Exitloop
    Sleep(500)
    WEnd
    _ScreenCapture_Capture(@ScriptDir & "\screen.png")

    [/autoit]

    E: Genau, csupenner hat Recht, deswegen gings auch nicht. So wie ich es gemacht hab gehts eigentlich da das Exitloop in der Schleife drin ist.

    2 Mal editiert, zuletzt von Jantastic (17. Juli 2011 um 12:16)

  • du darfst die exitloop nicht in eine seperate funktion packen, sondern musst sie direkt in die aktive schleife schreiben, soweit ich das noch in erinnerung hab.

  • das hatte ich auch nach schreiben der neuen frage geändert
    thx
    das problem ist die if-funktion wird insgesamt 32 mal aufgerufen
    aber ich habe jetzt glaube ich) ne lösung

  • die neue version sieht so aus:

    [autoit]

    Func errorSearch ($return)
    $ActiveWindow = WinGetTitle("")
    If $ActiveWindow = "[Fehlernachricht] - Windows Internet Explorer" Then
    $return = True
    ElseIf $ActiveWindow = "[website: Warnung] - Windows Internet Explorer" Then
    $return = True
    Else
    $return = False
    EndIf
    EndFunc

    [/autoit]

    und schleife

    [autoit]


    $a = False

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

    while True
    ...
    errorSearch($a)
    If $a = True Then
    ExitLoop
    Else
    EndIf
    ...
    WEnd

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

    Send("{PRINTSCREEN}")
    ...

    [/autoit]

    das geht auch nicht ;(
    ich werde jetzt mal eurwen weg probieren

  • Du möchtest bei einem Error einen Screenshot machen?

    Dann in die Schleife folegendes einbauen:

    [autoit]

    #include <ScreenCapture.au3>

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

    If @error Then
    _ScreenCapture_Capture(@MyDocumentsDir & "\Fehler.jpg")
    Exit
    EndIf

    [/autoit]

    MfG, campweb

  • ähm
    es handelt sich dabei um eine internetseite
    entweder es gibt irgendeine error und es heißt [fehlermeldung] - internet...
    oder er schreibt mist und es kommt [websit: error] -internet...

    das sieht er doch nicht als error an

  • ich habe das problem gelöst:
    statt

    [autoit]

    winGetTirle("[Active]")

    [/autoit]


    muss man

    [autoit]

    winGetTirle("[Windows Internet Explorer]")

    [/autoit]

    coden/ schreiben