Suche Idee: Abbrechen eines Unterprogramms

  • Hallo allesamt,

    schon länger beschäftige ich mich gedanklich mit einer Problematik, habe jedoch keine zufriedenstellende Idee. Bitte um konstruktive Anteilnahme ;-).

    Problematik:
    Ich habe ein Programm zur Prozesssteuerung geschrieben, welches mit zahlreichen Hotkeys bedient wird. Gerne hätte ich eine Möglichkeit, um zur beliebigen Zeit mit ESC die momentane Verarbeitung abzubrechen.

    In Schleifen, die schnelle Durchlaufszeiten haben, lässt sich natürlich in Realtime auch ein Flag (boolean) überprüfen. Sind es aber längere Verabeitungsabläufe, die wiederum viele Unterprogramme ausführen, die länger dauern können, wäre die Lösung überall eine Überprüfung des Flags zu setzen einfach lästig und 'deprecated'.

    Lösungsansatz:
    Wenn das Programm schon mit Hotkeys gesteuert wird, hat man den Vorteil, dass ein Drücken auf die festgelegte Abbruch-Taste einen Interrupt auslöst, welcher den aktuellen Prozesslauf unterbricht. Wenn nun schon eine Unterbrechung erfolgt ist, liegt die Idee nahe, den Programmstack zu manipulieren. Wenn nach Ablauf des Interrupts, der alle Abbruchbedingungen erfüllen kann, dann statt dem Rücksprung, das Programm in die Ausgangslage gebracht wird (z.B. Warte-Modus), hätte man schon gewonnen.

    Bin dankbar für jeden post

  • sehe ich das richtig: du möchtest bei einem SCRIPT im stack des prozesses rumfummeln, um gezielt einen return aus einer funktion zu erwirken, scheust dich aber andererseits einen bool einzufügen, weil es zu viel arbeit wäre ? :huh:

    PS: hast du schonmal versucht ein autoitscript zu debuggen und im debug-asm einen entsprechenden call in deine funktion zu finden ?

    Einmal editiert, zuletzt von WhiteLion (9. Oktober 2011 um 07:55)

  • Wie wäre es wenn dein Hotkey das Programm neustartet anstatt die aktuelle Funktion zu verlassen? Das würde dann auch funktionieren wenn sich das Programm in einer verschachtelten Funktionsstruktur befindet.
    Hier ein Beispiel:

    Spoiler anzeigen
    [autoit]


    HotKeySet("{ESC}", "Terminate")
    HotKeySet("!d", "main")
    MsgBox(0,"","neue instanz")

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

    While 1
    Sleep(100)
    WEnd

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

    Func main()
    TrayTip("Welcome","main started",10000)
    While 1
    ConsoleWrite("-----------------" & @CRLF)
    submain1()
    submain2()
    Sleep(100)
    WEnd
    EndFunc
    Func submain1()
    for $i=1 to 5
    ConsoleWrite("submain1" & @CRLF)
    Next
    EndFunc
    Func submain2()
    for $i=1 to 5
    ConsoleWrite("submain2" & @CRLF)
    Next
    ConsoleWrite("submain2-sleep" & @CRLF)
    Sleep(3000)
    EndFunc
    Func Terminate()
    MsgBox(0,"","scriptrestart")
    if @Compiled then
    ConsoleWrite("compiled: " & '"' & @AutoItExe & '"' & @CRLF)
    Run('"' & @AutoItExe & '"') ; startet weitere instanz des kompilierten scripts
    Else
    ConsoleWrite("not compiled: " & '"' & @AutoItExe & '" "' & @ScriptFullPath & '"' & @CRLF)
    Run('"' & @AutoItExe & '" "' & @ScriptFullPath & '"') ; startet weitere instanz des nicht kompilierten scripts
    EndIf
    Exit ; beendet aktuelle instanz
    EndFunc

    [/autoit]
  • zu WhiteLion:
    Ich habe weniger die Arbeit gescheut, sondern das Zumüllen des Codes. Außerdem würde der Abbruch mit einem Flag, nie im gewünschten Zeitpunkt, sondern frühstens nach Abarbeiten des letzten Schrittes erfolgen.

    zu misterspeed:
    Klasse! Die einfachste ist oft die beste Lösung ;-).
    Da ich in der Regel nach Abbruch lediglich in den Warte-Modus zurückkehren möchte, wäre dieser Weg vollkommen ausreichend. Beim Abbruch und Neustart ließen sich über eine temp-Datei Daten austauschen.

    Besten Dank für Beiträge. Ich lasse den Thread mal noch offen, falls jemand eine weitere Idee hätte und bette derweil den Vorschlag von misterspeed mal ein.