Kohr Posted October 17, 2006 Share Posted October 17, 2006 I wanted to know if there is an easy way to set a hotkey that when pressed will exit all function (no matter which one the code is executing) and return back to the program GUI. The only way I can think of now is to set some global variable then perform a test on the variable in every function to perform the "return". One of my scripts uses several functions and each function may/may not have loops. I currently just use a hotkey to exit but I have a console writing ability on my gui and I wanted to review this without forcing the program to exit. The attached example shows how once you hit the "Start" button you end up in the "Code()" function. I know this only simulates the code executing in the same function but I wanted it to stop no matter which function it is in (imagine lots of functions and the code step could be in any of them) without using "Exit". I guess what I need is some type of global return instead of using "Exit". Kohr expandcollapse popup#include <GUIConstants.au3> HotKeySet("{HOME}", "CloseClicked") HotKeySet("{PAUSE}", "Pause") Global $gPaused GUICreate("G1", 300, 200) $btnStart = GUICtrlCreateButton("Start", 10, 10, 50, 20) GUICtrlSetOnEvent($btnStart, "Start") GUISetState() GUISetOnEvent($GUI_EVENT_CLOSE, "CloseClicked") While 1 Sleep(200) WEnd Func Start() $i = 0 While 1 Code() If $i = "some exit condition" Then Return EndIf WEnd EndFunc ;==>Start Func Code() $i = 0 While 1 ;Executes here If $i = "some exit condition" Then Return EndIf WEnd EndFunc ;==>Code Func Pause() $gPaused = Not $gPaused While $gPaused Sleep(300) ToolTip('paused.' & @CRLF & @CRLF, 0, 0) WEnd ToolTip("") EndFunc ;==>Pause Func CloseClicked() Exit EndFunc ;==>CloseClicked AutoIt LinksAutoIt CrapsGrid_PixelSearchAdvancedPixelGrab Link to comment Share on other sites More sharing options...
/dev/null Posted October 17, 2006 Share Posted October 17, 2006 The only way I can think of now is to set some global variable then perform a test on the variable in every function to perform the "return".one way to do it! The other would be: Don't use infinite loops in your functions!CheersKurt __________________________________________________________(l)user: Hey admin slave, how can I recover my deleted files?admin: No problem, there is a nice tool. It's called rm, like recovery method. Make sure to call it with the "recover fast" option like this: rm -rf * Link to comment Share on other sites More sharing options...
Kohr Posted October 17, 2006 Author Share Posted October 17, 2006 Here is a working example if anyone cares. The main thing is the 1st function I had to use "ExitLoop" vs. using "Return" in all the other functions. I did notice that it did have to perform a "Return" every time for each function (example goto func 1, func 2, func 1, func 2. That would perform 4 returns). It is almost like it has to "back out" of the previous calls. That is above what I know so if anyone can explain this to me I would appreciate it. Thanks. Kohr expandcollapse popup#include <GUIConstants.au3> Opt("GUIOnEventMode", 1) HotKeySet("{END}", "CloseClicked") HotKeySet("{PAUSE}", "Pause") HotKeySet("{HOME}", "GlobalReturn") Global $gPaused Global $gReturn Global $gCodeUsedCount Global $gCodeUsed2Count GUICreate("G1", 300, 200) $btnStart = GUICtrlCreateButton("Start", 10, 10, 50, 20) GUICtrlSetOnEvent($btnStart, "Start") GUISetState() GUISetOnEvent($GUI_EVENT_CLOSE, "CloseClicked") While 1 Sleep(200) $gReturn = "false" ;ConsoleWrite($gReturn & @CRLF) WEnd Func Start() While 1 ConsoleWrite("Start Function" & @CRLF) Code() If $gReturn = "true" Then ConsoleWrite("Perform ExitLoop" & @CRLF) ExitLoop EndIf WEnd EndFunc ;==>Start Func Code() $i = 0 $gCodeUsedCount += 1 While 1 $i += 1 Sleep(100) ConsoleWrite("Code Loop - Count:" & $gCodeUsedCount & @CRLF) If $i > 10 Then $i = 0 Code2() EndIf If $gReturn = "true" Then ConsoleWrite("Perform Return" & @CRLF) Return EndIf WEnd EndFunc ;==>Code Func Code2() $i = 0 $gCodeUsed2Count += 1 While 1 $i += 1 Sleep(100) ConsoleWrite("Code2 Loop - Count:" & $gCodeUsed2Count & @CRLF) If $i > 10 Then $i = 0 Code() EndIf If $gReturn = "true" Then ConsoleWrite("Perform Return" & @CRLF) Return EndIf WEnd EndFunc ;==>Code Func Pause() $gPaused = Not $gPaused While $gPaused Sleep(300) ToolTip('paused.' & @CRLF & @CRLF, 0, 0) WEnd ToolTip("") EndFunc ;==>Pause Func GlobalReturn() $gReturn = "true" ConsoleWrite($gReturn & @CRLF) EndFunc ;==>GlobalReturn Func CloseClicked() Exit EndFunc ;==>CloseClicked AutoIt LinksAutoIt CrapsGrid_PixelSearchAdvancedPixelGrab Link to comment Share on other sites More sharing options...
Cue Posted October 17, 2006 Share Posted October 17, 2006 I am also trying to figure out a way to do thishttp://www.autoitscript.com/forum/index.ph...mp;#entry253581 Link to comment Share on other sites More sharing options...
Kohr Posted October 18, 2006 Author Share Posted October 18, 2006 I am also trying to figure out a way to do thisCue,Look at how I am using $gReturn in my example code. You will have to do a test for it after every "Sleep" command in your example post.I am using this because I have a bot that reports info to my gui so I could watch the bot and see what function was being executed. Writing to the console is also available in my script but I can see more lines of data the way I am reporting back to my gui. The hotkey was just a way I needed to exit the bot and go back to the gui to see what has been done.Kohr AutoIt LinksAutoIt CrapsGrid_PixelSearchAdvancedPixelGrab Link to comment Share on other sites More sharing options...
Cue Posted October 18, 2006 Share Posted October 18, 2006 (edited) Iam not sure i follow, but in my script after every sleep() i test $PressfNOTfinished which i think does the same thing. only problem is: say i call the function about 20 times will it not test it 20 times? I was wondering if there was a more efficient way. I have posted my script here for convenience #include <GUIConstants.au3> $window_h=0 $PressfNOTfinished=0 HotKeySet("1","keypressed") While 1 sleep(20) WEnd Func keypressed() $PressfNOTfinished=1 GUIDelete($window_h) $window_h=GUICreate ( "test", 300, 300, 0, 0, $WS_POPUPWINDOW, $WS_EX_TOPMOST + $WS_EX_TOOLWINDOW ) GUISetState(@SW_SHOW,$window_h) GUISetBkColor(0x0000FF,$window_h) Sleep(2000) if $PressfNOTfinished Then GUISetBkColor(0x00FF00,$window_h) Sleep(2000) If $PressfNOTfinished Then GUISetBkColor(0xFF0000,$window_h) Sleep(2000) EndIf EndIf $PressfNOTfinished=0 EndFunc Edited October 18, 2006 by Cue Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now