Jump to content

Interrupt function winwait


Recommended Posts

 

Hello,

 

I am trying to learn how this works. I want to be able to interrupt a running  function with winwait.. In this example I want to start notepad and than the script needs to  winwait for a specific window. 

But if that window does not appear then I want the user to be able to interrupt the function and start the next function (run nextprogram.exe")

I found some examples and mentioned winwait, but I still could not make it work.

I tried to adjust the tutorial https://www.autoitscript.com/wiki/Interrupting_a_running_function , but could not get this working either with a winwait 

I hope someone can put me in the right direction.

Code below is just one of my many attempts...

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

 AutoItSetOption("TrayIconDebug", 1) ;0-off ;AutoIt3Wrapper_Run_Debug_Mode=Y

 ; Set a HotKey
 HotKeySet("x", "_Interrupt")

 ; Declare a flag
 $fInterrupt = 0

 $hGUI = GUICreate("Test", 500, 500)

 $hButton_1 = GUICtrlCreateButton("Func One", 10, 10, 80, 30)
 $hButton_2 = GUICtrlCreateButton("Func Two", 10, 50, 80, 30)

 ; Create a dummy control for the Accelerator to action when pressed
 $hAccelInterupt = GUICtrlCreateDummy()
 ; Set an Accelerator key to action the dummy control
 Dim $AccelKeys[1][2]=[ ["z", $hAccelInterupt] ]
 GUISetAccelerators($AccelKeys)

 GUISetState()

 ; Intercept Windows command messages with out own handler
 GUIRegisterMsg($WM_COMMAND, "_WM_COMMAND")

 While 1
     Switch GUIGetMsg()
         Case $GUI_EVENT_CLOSE
             Exit
         Case $hButton_1
             _Func_1()
             _Func_3()
         Case $hButton_2
             _Func_2()
     EndSwitch
 WEnd

 ; Use a wrapper function in place of the blocking function
 Func _Func_1()
    ; Make sure the flag is cleared
    $fInterrupt = 0
    ;For $i = 1 To 20
run ("notepad")
        ConsoleWrite("-Func 1 Running" & @CRLF)
        ; Run a modified Sleep function which checks for the interrupt
        ;if _Interrupt_Sleep(1000) Then ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
            if _Interrupt_Sleep(999999999999999999999999999999999) Then ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

            ; The flag was set
            Switch $fInterrupt
                Case 1
                    ConsoleWrite("!Func 1 interrrupted by Func 2" & @CRLF)
                Case 2
                    ConsoleWrite("!Func 1 interrrupted by HotKey" & @CRLF)
                Case 3
                    ConsoleWrite("!Func 1 interrrupted by Accelerator" & @CRLF)
            EndSwitch
            Return
        EndIf
        Sleep(100)
 ;  Next
    ConsoleWrite(">Func 1 Ended" & @CRLF)
 EndFunc   ;==>_Func_1

 ; And here is the wrapper function itself
 Func _Interrupt_Sleep($iDelay)
    ; Get a timestamp
    Local $iBegin = TimerInit()
    ; And run a tight loop
    Do
        ; Use a minimum Sleep (could also be a WinWaitActive with a short timeout)
        ;Sleep(10)
        winwait("sdfdf","sdfsdf") ;<<<<<<----- the winwait for a window I want to skip
        ; Look for the interrrupt
        If $fInterrupt Then
            ; And return True immediately if set
            Return True
        EndIf
    Until TimerDiff($iBegin) > $iDelay
    ; Return False if timed out and no interrupt was set
    Return False
 EndFunc   ;==>_Interrupt_Sleep

 Func _Func_2()
     ;For $i = 1 To 3
     processclose("notepad.exe")
         ConsoleWrite("+Func 2 Running" & @CRLF)
         Sleep(100)
     ;Next
     ConsoleWrite(">Notepad killed!" & @CRLF)
 EndFunc
 
 Func _Func_3()
 run("nextprogam.exe")
 Endfunc

 Func _Interrupt()
     ; The HotKey was pressed so set the flag
     $fInterrupt = 2
 EndFunc

 Func _WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
     ; The Func 2 button was pressed so set the flag
     If BitAND($wParam, 0x0000FFFF) =  $hButton_2 Then $fInterrupt = 1
     ; The dummy control was actioned by the Accelerator key so set the flag
     If BitAND($wParam, 0x0000FFFF) =  $hAccelInterupt Then $fInterrupt = 3
     Return $GUI_RUNDEFMSG
 EndFunc   ;==>_WM_COMMAND

 

Edited by MightyWeird
Link to comment
Share on other sites

  • Moderators

MightyWeird,

Your functions are short and there is no need to interrupt them. This should do as you wish:

#include <GUIConstantsEx.au3>

$hGUI = GUICreate("Test", 500, 500)

$hButton_1 = GUICtrlCreateButton("Func One", 10, 10, 80, 30)
$hButton_2 = GUICtrlCreateButton("Func Two", 10, 50, 80, 30)

GUISetState()

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
        Case $hButton_1
            _Func_1()
        Case $hButton_2
            _Func_2()
    EndSwitch
WEnd

Func _Func_1()
    ConsoleWrite("-Func 1 Running" & @CRLF)
    Run("notepad")
    ConsoleWrite(">Func 1 Ended" & @CRLF)
EndFunc   ;==>_Func_1

Func _Func_2()
    ConsoleWrite("+Func 2 Running" & @CRLF)
    Do
        ProcessClose("notepad.exe")
        Sleep(10)
    Until Not ProcessExists("notepad.exe")
    ConsoleWrite(">Notepad killed!" & @CRLF)
    ConsoleWrite("+Func 2 Ended" & @CRLF)
    _Func_3()
EndFunc   ;==>_Func_2

Func _Func_3()
    ConsoleWrite("Running 'nextprogram.exe'" & @CRLF)
    ;Run("nextprogam.exe")
EndFunc   ;==>_Func_3

The code you were trying to use is for functions which take an age to run - not short discrete ones like yorus.

M23

Public_Domain.png.2d871819fcb9957cf44f4514551a2935.png Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind

Open spoiler to see my UDFs:

Spoiler

ArrayMultiColSort ---- Sort arrays on multiple columns
ChooseFileFolder ---- Single and multiple selections from specified path treeview listing
Date_Time_Convert -- Easily convert date/time formats, including the language used
ExtMsgBox --------- A highly customisable replacement for MsgBox
GUIExtender -------- Extend and retract multiple sections within a GUI
GUIFrame ---------- Subdivide GUIs into many adjustable frames
GUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView items
GUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeView
Marquee ----------- Scrolling tickertape GUIs
NoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxes
Notify ------------- Small notifications on the edge of the display
Scrollbars ----------Automatically sized scrollbars with a single command
StringSize ---------- Automatically size controls to fit text
Toast -------------- Small GUIs which pop out of the notification area

 

Link to comment
Share on other sites

Or maybe this is what you want ?

Global $fInterrupt = False

HotKeySet("x", "_Interrupt")

Local $hWnd
Do
  $hWnd = WinWait ("none","none",1)
Until $hWnd or $fInterrupt

If $hWnd Then
  ConsoleWrite ("WinWait succeeded" & @CRLF)
Else
  ConsoleWrite ("WinWait was interrupted" & @CRLF)
EndIf

Func _Interrupt()
  ; The HotKey was pressed so set the flag
   $fInterrupt = True
EndFunc

 

Edited by Nine
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...